TL-DR
docker ps --no-trunc
e docker inspect CONTAINER
forneça o ponto de entrada executado para iniciar o contêiner, juntamente com o comando passado para, mas isso pode perder algumas partes, como ${ANY_VAR}
porque as variáveis de ambiente do contêiner não são impressas como resolvidas.
Para superar isso, docker inspect CONTAINER
tem uma vantagem, pois também permite recuperar separadamente variáveis env e seus valores definidos no contêiner da Config.Env
propriedade.
docker ps
e docker inspect
forneça informações sobre o ponto de entrada executado e seu comando. Geralmente, esse é um script de ponto de entrada do wrapper ( .sh
) e não o programa "real" iniciado pelo contêiner. Para obter informações sobre isso, solicitando informações do processo ps
ou /proc/1/cmdline
ajuda.
1) docker ps --no-trunc
Ele imprime o ponto de entrada e o comando executado para todos os contêineres em execução. Enquanto imprime o comando passado para o ponto de entrada (se o passarmos), ele não mostra o valor das variáveis env do docker (como $FOO
or ${FOO}
).
Se nossos contêineres usam variáveis env, isso pode não ser suficiente.
Por exemplo, execute um contêiner alpino:
docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'
Quando usar docker -ps, como:
docker ps -a - nome do filtro = exemplo alpino --no-trunc
Imprime:
ID DO RECIPIENTE COMANDO DE IMAGEM NOMES DE PORTAS DE STATUS CRIADAS
5b064a6de6d8417 ... alpine: mais recente "sh -c 'ls $ MY_VAR'" 2 minutos atrás Saído (0) 2 minutos atrás alpine-example
Vemos o comando passado para o ponto de entrada: sh -c 'ls $MY_VAR'
mas na $MY_VAR
verdade não é resolvido.
2) docker inspect CONTAINER
Quando inspecionamos o contêiner de exemplo alpino:
docker inspect alpine-example | grep -4 Cmd
O comando também está lá, mas ainda não vemos o valor da variável env:
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
],
De fato, não conseguimos ver variáveis interpoladas com esses comandos do docker.
Enquanto compensação, poderíamos exibir separadamente as variáveis de comando e env para um contêiner com inspeção do docker:
docker inspect alpine-example | grep -4 -E "Cmd|Env"
Isso imprime:
"Env": [
"MY_VAR=/var",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
]
Uma maneira mais docker seria usar o --format
sinalizador docker inspect
que permite especificar atributos JSON para renderizar:
docker inspect --format '{{.Name}} {{.Config.Cmd}} {{ (.Config.Env) }}' alpine-example
Isso gera:
/ 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 o processo iniciado do próprio contêiner para executar contêineres
O ponto de entrada e o comando executados pelo docker podem ser úteis, mas em alguns casos, não é suficiente, porque "apenas" é um script de ponto de entrada do wrapper ( .sh
) responsável por iniciar o processo real / principal.
Por exemplo, quando executo um contêiner Nexus, o comando executado e mostrado para executar o contêiner é "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"
.
Para o PostgreSQL, é isso "docker-entrypoint.sh postgres"
.
Para obter mais informações, poderíamos executar em um contêiner em execução
docker exec CONTAINER ps aux
.
Pode imprimir outros processos que podem não nos interessar.
Para restringir o processo inicial iniciado pelo ponto de entrada, poderíamos fazer:
docker exec CONTAINER ps -1
Eu especifico 1
porque o processo executado pelo ponto de entrada geralmente é aquele com o 1
ID.
Sem ps
, ainda poderíamos encontrar as informações em /proc/1/cmdline
(na maioria das distribuições Linux, mas não em todas). Por exemplo :
docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo
Se tivermos acesso ao host do docker que iniciou o contêiner, outra alternativa para obter o comando completo do processo executado pelo ponto de entrada é:: execute ps -PID
onde PID é o processo local criado pelo daemon do Docker para executar o contêiner, como:
ps -$(docker container inspect --format '{{.State.Pid}}' CONTAINER)
Formatação fácil de usar com docker ps
docker ps --no-trunc
nem sempre é fácil de ler.
A especificação de colunas para impressão e em formato tabular pode melhorar:
docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"
Criar um alias pode ajudar:
alias dps='docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'