• Assurez la sécurité des applications de la bonne manière! Détectez, protégez, surveillez, accélérez et plus encore…
  • Exécuter des commandes dans un conteneur Docker est plus facile que vous ne le pensez.

    Un conteneur Docker est un environnement isolé qui contient généralement une seule application avec toutes les dépendances requises. Plusieurs fois, nous devons exécuter des commandes dans un conteneur docker. Il existe plusieurs façons d'exécuter une commande à l'intérieur d'un conteneur et d'obtenir la sortie requise.

    Voyons comment nous pouvons le faire.

    Utilisation de Interactive Shell

    Nous pouvons accéder directement au shell d'un conteneur et exécuter nos commandes comme avec un terminal Linux normal. Pour obtenir un shell interactif d'un conteneur arrêté (pas en état d'exécution), vous pouvez utiliser:

    $ docker run -it ubuntu bash
    [email protected]:/#

    Comme vous pouvez le voir, nous avons atterri directement dans un nouveau Ubuntu conteneur où nous pouvons exécuter nos commandes. Si un conteneur est déjà en cours d'exécution, vous pouvez utiliser exec commande comme ci-dessous.

    Tout d'abord, découvrons l'ID du conteneur.

    $ docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS       PORTS                      NAMES
    c2d969adde7a   nginx     "/docker-entrypoint.…"   2 hours ago   Up 2 hours   127.0.0.1:80->80/tcp       nginx
    0960560bc24b   mariadb   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   127.0.0.1:3306->3306/tcp   mariadb

    Et puis entrez dans l'ID de conteneur c2d969adde7a

    $ docker exec -it c2d969adde7a bash 
    [email protected]:/#

    Dans la sortie ci-dessus, vous pouvez observer que nous avons commencé un bash session de nginx conteneur qui était en état de marche. Ici, nous pouvons exécuter n'importe quelle commande prise en charge et obtenir la sortie.

    Notes - votre conteneur peut ne pas avoir de bash et si c'est le cas, vous pouvez utiliser sh.

    Ex:

    docker exec -it c2d969adde7a sh

    Sortie directe

    Souvent, nous avons juste besoin de la sortie d'une ou deux commandes et n'avons pas besoin d'une session interactive complète pour notre tâche. Vous pouvez exécuter la commande requise dans un conteneur et obtenir sa sortie directement sans ouvrir une nouvelle session shell en utilisant exec commande sans -it drapeau. Sa syntaxe serait:

    $ docker exec <container-id or name> <command>

    Voici un exemple :

    $ docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS       PORTS                      NAMES
    c2d969adde7a   nginx     "/docker-entrypoint.…"   2 hours ago   Up 2 hours   127.0.0.1:80->80/tcp       nginx
    0960560bc24b   mariadb   "docker-entrypoint.s…"   2 hours ago   Up 2 hours   127.0.0.1:3306->3306/tcp   mariadb
    
    $ docker exec 0960560bc24b ps -ef | grep mysql
    mysql          1       0  0 13:35 ?        00:00:02 mysqld
    $

    Nous avons exécuté ps -ef | grep mysql commande à l'intérieur de la course MariaDB conteneur et obtenu la sortie directement.

    Chemin Dockerfile

    Ce n'est pas la manière exacte dont vous pouvez exécuter des commandes dans un conteneur docker bien que cela puisse être utile dans les situations de développement ou pour le débogage du déploiement initial, etc. Nous pouvons utiliser RUN commande dans un Dockerfile. Voici notre exemple de Dockerfile:

    FROM nginx:latest
    RUN nginx -V

    Il tire simplement la dernière nginx image du registre, puis exécute le nginx -V commande pour afficher la version de Nginx lorsque vous créez l'image.

    $ docker build -t nginx-test .
    Sending build context to Docker daemon  2.048kB
    Step 1/2 : FROM nginx:latest
     ---> 7ce4f91ef623
    Step 2/2 : RUN nginx -V
     ---> Running in 43918bbbeaa5
    nginx version: nginx/1.19.9
    built by gcc 8.3.0 (Debian 8.3.0-6)
    built with OpenSSL 1.1.1d  10 Sep 2019
    TLS SNI support enabled
    configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.19.9/debian/debuild-base/nginx-1.19.9=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
    Removing intermediate container 43918bbbeaa5
     ---> d682277f2e50
    Successfully built d682277f2e50
    Successfully tagged nginx-test:latest
    $

    Observez la sortie de RUN commande dans l'extrait de code ci-dessus. L'extrait de code ci-dessus ne sera affiché que sur la première version et les versions consécutives ne répéteront pas le RUN sortie de commande. Pour contourner ce problème, vous pouvez essayer --no-cache drapeau:

    $ docker build -t nginx-test . --no-cache

    La dernière méthode n'est pas la meilleure mais peut être parfois utile pour le débogage, etc.

    Résumé

    Exécution de la commande dans un docker récipient est simple et il existe quelques méthodes pour le faire. C'est une tâche régulière d'un administrateur Docker, il est donc utile de connaître ces commandes.

    Ensuite, découvrez quelques-uns des Commandes Docker.