Veja o comando completo do contêiner em execução / parado no Docker


263

Como posso ver o comando completo de um contêiner / processo em execução no 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

Só consigo ver "nginx -g 'daemon de" .. aqui, não o comando completo.


Respostas:


545

docker ps --no-trunc exibirá o comando completo junto com os outros detalhes dos contêineres em execução.


13
Obrigado, isso ajudou muito. Apenas uma observação: '-notrunc' foi descontinuado, substituído por --no-trunc.
Prometheus

2
Isso não funcionou para mim. Ele me deu o comando, mas não todos os comutadores (que é o que penso ao usar o "comando completo"). O comando runlike mencionado outro link acima funcionou melhor para mim.
Dylan Smith

1
para o comando completo de apenas contêineres em execução, remova o comando all. docker ps --no-trunc
Jacob Morris

Obrigado - corrigido. Meu comando anterior era para todos os contêineres e não apenas para contêineres, que era a pergunta original.
Scott S.

O comando não truncado pode ser muito longo, veja apenas os primeiros 400 caracteres com cada linhadocker ps --all --no-trunc|cut -c-400
rubo77 16/04

183

Usar:

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

... faz uma "janela de encaixe inspecionar" para todos os contêineres.


8
Isso não exibe o comando docker ps. O comando docker ps corresponde à docker inspecionar Path e Args.
JDiMatteo 13/09/16

3
No bueno em Jan 2018
sg

4
iedocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul

2
Se você estiver jogando apenas sudona frente do comando, receberá "docker inspect" requires at least 1 argument(s).a segunda chamada para obter todos os nomes de contêineres, provavelmente desejará adicionar um sudo apenas dentro do $(.
RandomInsano

e para aqueles que querem uma melhor compreensão da consulta -f, eu encontrei uma boa explicação aqui container-solutions.com/docker-inspect-template-magic
intijk

16

Usar:

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

Isso exibirá o caminho e os argumentos do comando, semelhante a docker ps.


Como você modificaria isso para procurar um comando específico como kube-apiserver?
22417 Jonathan

@ Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
RRW

8

Use runlike no repositório git https://github.com/lavie/runlike

Para instalar runlike

pip install runlike

Como ele aceita o ID do contêiner como argumento, para extrair o ID do contêiner, use o seguinte comando

docker ps -a -q

Você é bom em usar runlike para extrair o comando docker run completo com o seguinte comando

runlike <docker container ID>

Não funciona O show "Command '[' docker ',' inspecionar ', u'06e6a369f909'] 'retornou um status de saída diferente de zero 1"
fstang 28/03/19

Você instalou runlike como já referi
Abhishek Jain

5
Mesmo melhor você pode executar runlike dentro de um recipiente janela de encaixe e evitar instalá-lo:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith

3

TL-DR

docker ps --no-trunce docker inspect CONTAINERforneç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 CONTAINERtem uma vantagem, pois também permite recuperar separadamente variáveis ​​env e seus valores definidos no contêiner da Config.Envpropriedade.

docker pse docker inspectforneç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 psou /proc/1/cmdlineajuda.


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 $FOOor ${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 --formatsinalizador docker inspectque 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 1porque o processo executado pelo ponto de entrada geralmente é aquele com o 1ID.

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

2

Movendo o comentário de Dylan para uma resposta completa porque MUITO ÚTIL:

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

O que isso faz? Executa https://github.com/lavie/runlike dentro de um contêiner, fornece o comando completo da janela de encaixe e remove o contêiner para você.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.