Vea el comando completo del contenedor en ejecución / detenido en Docker

263

¿Cómo puedo ver el comando completo de un contenedor / proceso en ejecución en 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

Solo puedo ver "nginx -g 'daemon of" ... aquí, no el comando completo.

Niklas9
fuente
2
ver aquí también: stackoverflow.com/q/32758793/1747983
Tilo

Respuestas:

545

docker ps --no-trunc mostrará el comando completo junto con los demás detalles de los contenedores en ejecución.

Scott S.
fuente
13
Gracias, esto ayudó mucho. Solo una nota: '-notrunc' está en desuso, reemplazado por --no-trunc.
Prometheus
2
Esto no funcionó para mí. Me dio el comando pero no todos los interruptores (que es lo que pienso cuando uso el "comando completo"). El comando runlike mencionado en otro enlace anterior funcionó mejor para mí.
Dylan Smith
1
para el comando completo de solo contenedores en ejecución simplemente elimine el comando all. docker ps --no-trunc
Jacob Morris
Gracias - corregido. Mi comando anterior era para todos los contenedores y no solo para ejecutar contenedores, que era la pregunta original.
Scott S.
El comando no truncado puede ser muy largo, vea solo los primeros 400 caracteres en cada línea condocker ps --all --no-trunc|cut -c-400
rubo77
183

Utilizar:

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

... realiza una "inspección del acoplador" para todos los contenedores.

st0ne
fuente
8
Esto no muestra el comando docker ps. El comando docker ps corresponde a docker inspeccionar Path y Args.
JDiMatteo
3
No bueno a partir de enero de 2018
sg
44
es decirdocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul
2
Si solo está lanzando sudofrente al comando, obtendrá "docker inspect" requires at least 1 argument(s).debido a la segunda llamada para obtener todos los nombres de contenedor, probablemente desee agregar un sudo justo dentro del $(.
RandomInsano
y para aquellos que desean una mejor comprensión de la consulta -f, he encontrado una buena explicación aquí container-solutions.com/docker-inspect-template-magic
intijk
16

Utilizar:

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

Eso mostrará la ruta de comando y los argumentos, similares a docker ps.

JDiMatteo
fuente
¿Cómo modificaría esto para buscar un comando específico como kube-apiserver?
Jonathan
@Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw
8

Use runlike del repositorio de git https://github.com/lavie/runlike

Para instalar runlike

pip install runlike

Como acepta la identificación del contenedor como argumento, para extraer la identificación del contenedor, use el siguiente comando

docker ps -a -q

Puede usar runlike para extraer el comando completo de ejecución de Docker con el siguiente comando

runlike <docker container ID>
Abhishek Jain
fuente
No funciona Mostrar "El comando '[' docker ',' inspeccionar ', u'06e6a369f909'] 'devolvió el estado de salida no cero 1"
fstang
¿Has instalado runlike como mencioné
Abhishek Jain
55
Aún mejor, puede ejecutar runlike dentro de un contenedor acoplable y evitar instalarlo:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith
3

TL-DR

docker ps --no-truncy docker inspect CONTAINERproporcione el punto de entrada ejecutado para iniciar el contenedor, junto con el comando pasado a, pero eso puede faltar algunas partes, como ${ANY_VAR}porque las variables de entorno del contenedor no se imprimen como resueltas.

Para superar eso, docker inspect CONTAINERtiene una ventaja porque también permite recuperar por separado las variables env y sus valores definidos en el contenedor desde la Config.Envpropiedad.

docker psy docker inspectproporcionar información sobre el punto de entrada ejecutado y su comando. A menudo, es un script de punto de entrada de contenedor ( .sh) y no el programa "real" iniciado por el contenedor. Para obtener información sobre eso, solicite información de proceso pso /proc/1/cmdlineayuda.


1) docker ps --no-trunc

Imprime el punto de entrada y el comando ejecutado para todos los contenedores en ejecución. Si bien imprime el comando pasado al punto de entrada (si lo pasamos), no muestra el valor de las variables docker env (como $FOOo ${FOO}).
Si nuestros contenedores usan variables env, puede que no sea suficiente.

Por ejemplo, ejecute un contenedor alpino:

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

Cuando use docker -ps como:

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

Imprime:

ID DE CONTENEDOR MANDO DE IMAGEN ESTADO CREADO NOMBRES DE PUERTOS
5b064a6de6d8417 ... alpine: último "sh -c 'ls $ MY_VAR'" Hace 2 minutos Salido (0) Hace 2 minutos alpine-example

Vemos el comando pasado al punto de entrada: sh -c 'ls $MY_VAR'pero de $MY_VAR hecho no se resuelve.

2) docker inspect CONTAINER

Cuando inspeccionamos el contenedor de ejemplo alpino:

docker inspect alpine-example | grep -4 Cmd

El comando también está allí, pero aún no vemos el valor de la variable env:

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

De hecho, no pudimos ver variables interpoladas con estos comandos docker.
Si bien, como compensación, podríamos mostrar por separado las variables de comando y env para un contenedor con docker inspeccionar:

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

Que imprime:

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

Una forma más acoplable sería utilizar el --formatindicador de docker inspectque permite especificar atributos JSON para representar:

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

Eso da salida:

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

3) Recupere el proceso iniciado desde el contenedor para ejecutar contenedores

El punto de entrada y el comando ejecutado por docker pueden ser útiles, pero en algunos casos, no es suficiente porque eso es "solo" un script de punto de entrada de contenedor ( .sh) que es responsable de iniciar el proceso real / central.
Por ejemplo, cuando ejecuto un contenedor Nexus, el comando ejecutado y mostrado para ejecutar el contenedor es "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
Para PostgreSQL que es "docker-entrypoint.sh postgres".

Para obtener más información, podríamos ejecutar en un contenedor en ejecución docker exec CONTAINER ps aux.
Puede imprimir otros procesos que pueden no interesarnos.
Para limitarnos al proceso inicial lanzado por el punto de entrada, podríamos hacer:

docker exec CONTAINER ps -1

Especifico 1porque el proceso ejecutado por el punto de entrada es generalmente el que tiene la 1identificación.

Sin ps, aún podríamos encontrar la información en /proc/1/cmdline(en la mayoría de las distribuciones de Linux, pero no en todas). Por ejemplo :

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

Si tenemos acceso al host docker que inició el contenedor, otra alternativa para obtener el comando completo del proceso ejecutado por el punto de entrada es:: ejecutar ps -PIDdonde PID es el proceso local creado por el demonio Docker para ejecutar el contenedor como:

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

Formateo fácil de usar con docker ps

docker ps --no-truncNo siempre es fácil de leer.
Especificar columnas para imprimir y en formato tabular puede mejorarlo:

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

Crear un alias puede ayudar:

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

Moviendo el comentario de Dylan a una respuesta completa porque DEMASIADO ÚTIL:

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

¿Qué hace? Ejecuta https://github.com/lavie/runlike dentro de un contenedor, le da el comando completo de ejecución de la ventana acoplable, luego elimina el contenedor por usted.

Gunar Gessner
fuente