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}}"'