Voir la commande complète du conteneur en cours d'exécution / arrêté dans Docker

264

Comment puis-je voir la commande complète d'un conteneur / processus en cours d'exécution dans Docker?

$ docker ps --all
CONTAINER ID    IMAGE          COMMAND                 CREATED          STATUS                     PORTS    NAMES
5b6291859b61    nginx:1.7.8    "nginx -g 'daemon of    4 minutes ago    Exited (0) 4 minutes ago            thirsty_brattain

Je ne vois que "démon nginx -g 'de" .. ici, pas la commande complète.

Niklas9
la source
2
voir ici aussi: stackoverflow.com/q/32758793/1747983
Tilo

Réponses:

546

docker ps --no-trunc affichera la commande complète avec les autres détails des conteneurs en cours d'exécution.

Scott S.
la source
13
Merci, ça a beaucoup aidé. Juste une note: '-notrunc' est déconseillé, remplacé par --no-trunc.
Prométhée
2
Ça n'a pas marché pour moi. Il m'a donné la commande mais pas tous les commutateurs (ce à quoi je pense en utilisant la "commande complète"). La commande runlike mentionnée autre lien ci-dessus a mieux fonctionné pour moi.
Dylan Smith
1
pour la commande complète de l'exécution de conteneurs uniquement, supprimez simplement la commande all. docker ps --no-trunc
Jacob Morris
Merci - corrigé. Ma commande précédente concernait tous les conteneurs et pas seulement l'exécution de conteneurs, ce qui était la question d'origine.
Scott S.19
La commande non tronquée peut être très longue, ne voir que les 400 premiers caractères de chaque ligne avecdocker ps --all --no-trunc|cut -c-400
rubo77
183

Utilisation:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

... il effectue une "inspection de docker" pour tous les conteneurs.

st0ne
la source
8
Cela n'affiche pas la commande docker ps. La commande docker ps correspond à docker inspect Path and Args.
JDiMatteo
3
Pas de bueno en janvier 2018
sg
4
soitdocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul
2
Si vous lancez juste sudodevant la commande, vous obtiendrez à "docker inspect" requires at least 1 argument(s).cause du deuxième appel pour obtenir tous les noms de conteneurs, vous voudrez probablement ajouter un sudo juste à l'intérieur de la $(.
RandomInsano
et pour ceux qui veulent mieux comprendre la requête -f, j'ai trouvé une bonne explication ici container-solutions.com/docker-inspect-template-magic
intijk
16

Utilisation:

docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)

Cela affichera le chemin de commande et les arguments, similaires à docker ps.

JDiMatteo
la source
Comment modifieriez-vous cela pour rechercher une commande spécifique telle que kube-apiserver?
Jonathan
@Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw
8

Utilisez runlike depuis le dépôt git https://github.com/lavie/runlike

Pour installer runlike

pip install runlike

Comme il accepte l'ID de conteneur comme argument, pour extraire l'ID de conteneur, utilisez la commande suivante

docker ps -a -q

Vous êtes bon d'utiliser runlike pour extraire la commande runer docker complète avec la commande suivante

runlike <docker container ID>
Abhishek Jain
la source
Ça ne marche pas. Show "Command '[' docker ',' inspect ', u'06e6a369f909'] 'a renvoyé le statut de sortie non nul 1"
fstang
Avez-vous installé runlike comme je l'ai mentionné
Abhishek Jain
5
Encore mieux, vous pouvez exécuter runlike dans un conteneur docker et éviter de l'installer:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith
3

TL-DR

docker ps --no-truncet docker inspect CONTAINERfournir le point d'entrée exécuté pour démarrer le conteneur, le long de la commande passée à, mais qui peut manquer certaines parties, par exemple ${ANY_VAR}parce que les variables d'environnement du conteneur ne sont pas imprimées comme résolues.

Pour surmonter cela, docker inspect CONTAINERprésente un avantage car il permet également de récupérer séparément les variables env et leurs valeurs définies dans le conteneur à partir de la Config.Envpropriété.

docker pset docker inspectfournir des informations sur le point d'entrée exécuté et sa commande. Il s'agit souvent d'un script de point d'entrée wrapper ( .sh) et non du programme "réel" démarré par le conteneur. Pour obtenir des informations à ce sujet, demandez des informations sur le processus avec psou /proc/1/cmdlineaide.


1) docker ps --no-trunc

Il imprime le point d'entrée et la commande exécutée pour tous les conteneurs en cours d'exécution. Bien qu'il affiche la commande passée au point d'entrée (si nous passons cela), il n'affiche pas la valeur des variables env de docker (telles que $FOOou ${FOO}).
Si nos conteneurs utilisent des variables env, cela peut ne pas être suffisant.

Par exemple, exécutez un conteneur alpin:

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'

Lors de l'utilisation de docker -ps tels que:

docker ps -a --filter name = alpine-example --no-trunc

Il imprime:

NOMS DE PORTS D'ÉTAT CRÉÉS PAR COMMANDE D'IMAGE ID DE CONTENANT
5b064a6de6d8417 ... alpine: dernier "sh -c 'ls $ MY_VAR'" Il y a 2 minutes Quitté (0) Il y a 2 minutes alpine-example

Nous voyons la commande passée au point d'entrée: sh -c 'ls $MY_VAR'mais $MY_VAR n'est en effet pas résolue.

2) docker inspect CONTAINER

Lorsque nous inspectons le conteneur de l'exemple alpin:

docker inspect alpine-example | grep -4 Cmd

La commande est également là mais nous ne voyons toujours pas la valeur de la variable env:

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],

En fait, nous ne pouvions pas voir les variables interpolées avec ces commandes docker.
Bien que comme compromis, nous pourrions afficher séparément les variables de commande et d'environnement pour un conteneur avec docker inspect:

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"

Cela imprime:

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]

Une manière plus docker serait d'utiliser le --formatdrapeau de docker inspectqui permet de spécifier les attributs JSON à rendre:

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example

Cela génère:

/ alpine-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin]

3) Récupérez le processus démarré du conteneur lui-même pour exécuter les conteneurs

Le point d'entrée et la commande exécutés par docker peuvent être utiles mais dans certains cas, ils ne suffisent pas car il s'agit "uniquement" d'un script de point d'entrée wrapper ( .sh) qui est chargé de démarrer le processus réel / principal.
Par exemple, lorsque j'exécute un conteneur Nexus, la commande exécutée et affichée pour exécuter le conteneur est "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
Pour PostgreSQL, c'est "docker-entrypoint.sh postgres".

Pour obtenir plus d'informations, nous pouvons exécuter sur un conteneur en cours d'exécution docker exec CONTAINER ps aux.
Il peut imprimer d'autres processus qui pourraient ne pas nous intéresser.
Pour limiter le processus initial lancé par le point d'entrée, nous pourrions faire:

docker exec CONTAINER ps -1

Je précise 1car le processus exécuté par le point d'entrée est généralement celui avec l' 1id.

Sans ps, nous pourrions toujours trouver les informations dans /proc/1/cmdline(dans la plupart des distributions Linux mais pas toutes). Par exemple :

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo    

Si nous avons accès à l'hôte docker qui a démarré le conteneur, une autre alternative pour obtenir la commande complète du processus exécuté par le point d'entrée est:: exécuter ps -PIDoù PID est le processus local créé par le démon Docker pour exécuter le conteneur, par exemple:

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)

Formatage convivial avec docker ps

docker ps --no-truncn'est pas toujours facile à lire.
La spécification des colonnes à imprimer et dans un format tabulaire peut améliorer la situation:

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"

La création d'un alias peut aider:

alias dps='docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'
davidxxx
la source
2

Déplacer le commentaire de Dylan dans une réponse complète car TROP UTILE:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

Qu'est ce que ça fait? Exécute https://github.com/lavie/runlike à l' intérieur d'un conteneur, vous obtient la commande complète de docker run, puis supprime le conteneur pour vous.

Gunar Gessner
la source