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

123

Je souhaite inspecter une image de menu fixe créée par quelqu'un d'autre avec à la fois 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 qu'il soit vide (je n'ai donc pas à utiliser "--login")?

chaîne
la source

Réponses:

126

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

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

EDIT: Depuis Docker 1.3, vous pouvez utiliser execun processus dans un conteneur en cours d’exécution. Commencez votre conteneur comme vous le feriez normalement, puis saisissez-le en indiquant:

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.

Panagiotis Moustafellos
la source
Est-ce que cela n'exécuterait 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 fichier Docker - ou manque-t-il quelque chose?)
warp
Est-ce que c'est quelque chose de différent pour les versions plus anciennes / plus récentes de docker? Pour moi, il s'agit certainement du point d' entrée : gist.github.com/warpr/26a5cc471dce7fcf9021 . Ceci utilise docker 0.10.0 sur Ubuntu 13.10.
chaîne
4
Je sais que passer --entrypoint remplace le point d’entrée. Mais quand j'utilise --entrypoint, comment puis-je remplacer CMD par vide? (Pour bash, je peux utiliser quelque chose comme -i ou --login, mais tous les points d’entrée que je souhaiterais utiliser n’auront pas un argument "factice" équivalent).
chaîne
1
Au moins dans Docker v1.11.1, il semble que le remplacement du paramètre --entrypoint empêche également l’ajout normal du CMD au point d’entrée. Cela ne semble se produire que lorsque le point d’entrée n’est pas remplacé.
Jasmine Hegman
1
Pourquoi il y a un -iaprès $IMAGE?
Eyal Levin
27

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

Partie pertinente:

CMD (commande ou options par défaut) Rappelez la commande optionnelle 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 a peut-être déjà fourni une COMMANDE par défaut à l'aide du CMD Dockerfile. 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 COMMAND.

Si l'image spécifie également un ENTRYPOINT, le CMD ou la COMMANDE est ajouté en tant qu'argument à ENTRYPOINT.

Donc , pour faire ce que vous voulez , vous devez seulement spécifier un cmd et passer outre à l' aide /bin/bash. Pas tout à fait "vide", mais ça fait 99% du travail.

Simon Thum
la source
Oups, j'ai négligé un détail. Sauf pour raccourcir --loginà -lJe suppose que votre solution est déjà aussi bon qu'il obtient.
Simon Thum
Voici une chose amusante que j'ai vue aujourd'hui: la commande n'est pas remplacée, elle est ajoutée. Voici le PS de l'intérieur du conteneur. Notez que la commande que j’ai ajoutée était echo "configurer la base de données" et que la commande intégrée est / usr / bin / geth. De plus, je mets le point d’entrée à "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S
Le lien de référence de docker ne fonctionne plus - impossible de lui trouver un remplaçant évident.
Chris Kimpton
Je viens de le réparer, mais j'ai également eu du mal à le trouver; (
Simon Thum le
15

Pour tous ceux qui viennent ici pour substituer une commande entrypoint AND à une autre, par exemple, exécutez bash au lieu du script entrypoint, puis exécutez une autre commande avec des paramètres (cela ne me semblait pas clair à partir d'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/shdonc ici vous pouvez passer toute commande que vous voudriez exécuter dans un conteneur. /bin/shest pour les images alpines, le /bin/bashplus probable pour les autres images.

infro
la source
1
juste un addtion shell doit être écrit en JSON, donc au lieu de guillemets simples, '...'utilisez des guillemets doubles"..."
Jimmy Obonyo Abor 11/09/17
Ou passez simplement autant d'arguments - de points de départ que vous le souhaitez
Nick Roz
cela ne semble pas fonctionner: "exec: \" - c \ ": fichier exécutable introuvable dans $ PATH": inconnu.
Richard
Vérifiez le chemin dans le conteneur, il n’existe peut-être pas vraiment. La plupart des images ont, /bin/shmais le vôtre pourrait ne pas être ce cas.
Infro