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


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 par le fait qu'il soit vide (je n'ai donc pas à utiliser "--login")?


82
2018-05-10 12:59


origine




Réponses:


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 exec exécuter un 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.


90
2018-05-12 09:28



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? C'est certainement le point d'entrée pour moi: gist.github.com/warpr/26a5cc471dce7fcf9021 . Ceci utilise docker 0.10.0 sur Ubuntu 13.10. - warp
Qui passe -entrypoint remplace le point d'entrée. Voir la réponse modifiée - Panagiotis Moustafellos
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 pourrais vouloir utiliser n’auront pas un argument "factice" équivalent). - warp
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


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 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 dont vous avez besoin seulement spécifiez une cmd et remplacez en utilisant /bin/bash. Pas tout à fait "vide", mais ça fait 99% du travail.


19
2018-06-12 07:31



Oups, j'ai négligé un détail. Sauf pour raccourcir --loginà -l Je suppose que votre solution est déjà aussi bonne que possible. - Simon Thum
Voici une chose amusante que j'ai vue aujourd'hui: la commande n'est pas annulée, elle est ajoutée. Voici le PS de l'intérieur du conteneur. Notez que la commande que j’ai ajoutée est 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 je trouvais aussi difficile à trouver; ( - Simon Thum


Pour que toute personne venant ici remplace la commande entrypoint AND et transmette une autre commande, par exemple. lancez bash au lieu du script entrypoint, puis lancez 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/sh alors ici vous pouvez passer toute commande que vous voudriez exécuter dans un conteneur. /bin/sh est pour les images alpines, /bin/bash très probablement pour d'autres images.


7
2018-05-04 07:28



juste un ajout de commandes shell devrait être basé sur JSON, donc au lieu de citer entre guillemets '...' utilisez des guillemets doubles "..." - Jimmy Obonyo Abor