236 votes

Comment puis-je remplacer CMD lors de l'exécution d'une image docker ?

Je veux inspecter une image docker créée par quelqu'un d'autre avec un point d'entrée et une commande spécifiés, par exemple :

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Je le fais actuellement :

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

Existe-t-il un moyen de faire en sorte que CMD soit vide (pour ne pas avoir à utiliser "--login") ?

249voto

Matt Fletcher Points 393

Vous pouvez simplement entrer via docker run -it --entrypoint=/bin/bash $IMAGE -i (vous lancerez un nouveau conteneur à partir de l'image et obtiendrez un bash Shell en mode interactif), puis exécutez la commande entrypoint dans ce conteneur.

Vous pouvez alors inspecter le conteneur en cours d'exécution dans l'état où il devrait se trouver.

EDIT : Depuis Docker 1.3 vous pouvez utiliser exec pour exécuter un processus dans un conteneur en cours d'exécution. Démarrez votre conteneur comme vous le feriez normalement, puis entrez dans le conteneur en émettant :

docker exec -it $CONTAINER_ID /bin/bash

En supposant que bash est installé, vous aurez un accès Shell au conteneur en cours d'exécution.

0 votes

Cela n'exécuterait-il pas "/usr/sbin/apache2ctl /bin/bash" ? (parce que votre exemple ne remplace pas le point d'entrée, il utilisera le point d'entrée défini dans le Dockerfile - ou est-ce que j'ai manqué quelque chose ?)

0 votes

Est-ce que c'est quelque chose qui est différent pour les anciennes/nouvelles versions de Docker peut-être ? En tout cas, pour moi, cela fait fonctionner le point d'entrée : gist.github.com/warpr/26a5cc471dce7fcf9021 . Ceci en utilisant docker 0.10.0 sur Ubuntu 13.10.

0 votes

Passing -entrypoint remplace le point d'entrée. Voir la réponse éditée

60voto

Simon Thum Points 571

Voir : https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Portion pertinente :

CMD (Commande ou options par défaut) Rappelez-vous l'option COMMAND dans la ligne de commande de Docker :

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Cette commande est facultative car la personne qui a créé l'IMAGE peut avoir déjà fourni une COMMANDE par défaut à l'aide du Dockerfile CMD. En tant qu'opérateur (la personne qui exécute un conteneur à partir de l'image), vous pouvez remplacer ce CMD en spécifiant simplement une nouvelle COMMANDE.

Si l'image spécifie également un ENTRYPOINT, le CMD ou le COMMAND sont ajoutés comme arguments à l'ENTRYPOINT.

Donc pour faire ce que vous voulez, vous devez seulement spécifier un cmd, et le remplacer en utilisant /bin/bash . Pas tout à fait "vide", mais il fait le travail à 99%.

0 votes

Oups, j'ai négligé un détail. Sauf pour le shortening --login a -l Je suppose que votre solution est déjà aussi bonne que possible.

1 votes

Voici une chose amusante que j'ai vue aujourd'hui : la commande n'est pas remplacée, elle est ajoutée. Voici le PS depuis l'intérieur du conteneur. Notez que la commande que j'ai ajoutée était echo "setting up the db" et que la commande intégrée est /usr/bin/geth. J'ai également défini le point d'entrée comme étant "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db

0 votes

Le lien vers la référence docker ne fonctionne plus - je n'ai pas trouvé de remplacement évident.

49voto

Aurelijus Rozenas Points 462

Pour tous ceux qui viennent ici pour remplacer le point d'entrée ET la commande pour passer une autre commande, par exemple, exécuter bash au lieu du point d'entrée script et ensuite exécuter une autre commande avec des paramètres (ce n'était pas clair pour moi dans les autres réponses) :

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...' est un paramètre pour /bin/sh donc ici vous pouvez passer n'importe quelle commande que vous voulez exécuter dans le conteneur. /bin/sh est pour les images alpines, /bin/bash très probablement pour d'autres images.

2 votes

Juste un ajout Shell devraient être écrites en json, donc au lieu de citer avec des guillemets simples '...' utiliser les guillemets "..."

2 votes

Ou passez simplement autant d'arguments --entrypoint que vous voulez

0 votes

Cela ne semble pas fonctionner : "exec : \"-c\" : fichier exécutable non trouvé dans $PATH" : inconnu.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X