web-dev-qa-db-fra.com

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

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

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

Je fais actuellement:

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

Existe-t-il un moyen de remplacer CMD pour être vide (donc je n'ai pas besoin d'utiliser "--login")?

146
warp

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 shell bash en mode interactif), puis exécutez la commande entrypoint dans ce conteneur.

Vous pouvez ensuite inspecter le conteneur en cours d'exécution dans l'état où il devrait être exécuté.

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-le en émettant:

docker exec -it $CONTAINER_ID /bin/bash

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

153

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

Portion pertinente:

CMD (commande ou options par défaut) Rappelez la commande facultative dans la ligne de commande 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 exécutant un conteneur à partir de l'image), vous pouvez remplacer ce CMD simplement en spécifiant une nouvelle COMMANDE.

Si l'image spécifie également un ENTRYPOINT, le CMD ou la COMMANDE sont ajoutés en tant qu'arguments au ENTRYPOINT.

Donc, pour faire ce que vous voulez, vous avez besoin seulement spécifiez un cmd et remplacez en utilisant /bin/bash. Pas tout à fait "vide", mais cela fait 99% du travail.

31
Simon Thum

Pour toute personne venant ici pour remplacer le point d'entrée AND pour passer une autre commande, par exemple exécutez bash au lieu du script de point d'entrée, puis exécutez une autre commande avec des paramètres (ce n'était pas clair pour moi d'après les autres réponses):

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

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

20
infro