AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 596994
Accepted
estani
estani
Asked: 2014-05-20 07:28:30 +0800 CST2014-05-20 07:28:30 +0800 CST 2014-05-20 07:28:30 +0800 CST

Como posso depurar uma inicialização de contêiner docker?

  • 772

Eu tive um problema com um contêiner, embora ele seja construído perfeitamente, ele não inicia corretamente. A causa é uma solução que adicionei ao Dockerfile (para ter um roteamento /etc/hosts auto-configurado)

RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-override
ADD hosts.template /etc-override/hosts
RUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override

Obviamente, há algum erro lá, mas me pergunto como posso obter mais informações sobre o que o docker está fazendo durante a execução. por exemplo, isso funciona:

$ docker run image ls
usr bin ...

Mas isso não:

$ docker run image ls -l
$

Não há nada nos logs e também não posso chamar um shell interativo. Eu posso usar strace para ver o que está acontecendo, mas eu esperava que houvesse uma maneira melhor.

Existe alguma maneira de definir o docker para ser mais detalhado?

EDIT : Graças a Andrew D. Agora eu sei o que há de errado com o código acima (deixei para que sua resposta possa ser entendida). Agora, o problema ainda é como posso depurar algo assim ou obter algumas informações sobre por que ls -l falhou por que ls não falhou.

EDIT : O -D=true pode dar mais saída, embora não no meu caso ...

docker
  • 5 5 respostas
  • 260000 Views

5 respostas

  • Voted
  1. Best Answer
    Peter Lamberg
    2015-12-23T05:24:06+08:002015-12-23T05:24:06+08:00

    O comando Docker eventspode ajudar e o comando Docker logs pode buscar logs mesmo depois que a imagem falhou ao iniciar.

    Primeiro comece docker eventsem segundo plano para ver o que está acontecendo.

    docker events&
    

    docker run ...Em seguida, execute seu comando com falha . Então você deve ver algo como o seguinte na tela:

    2015-12-22T15:13:05.503402713+02:00 xxxxxxxacd8ca86df9eac5fd5466884c0b42a06293ccff0b5101b5987f5da07d: (from xxx/xxx:latest) die
    

    Então você pode obter o ID hexadecimal de inicialização da mensagem anterior ou a saída do comando de execução. Então você pode usá-lo com o comando logs:

    docker logs <copy the instance id from docker events messages on screen>
    

    Agora você deve ver alguma saída da inicialização da imagem com falha.

    Como @alexkb sugeriu em um comentário: docker events&pode ser problemático se seu contêiner estiver sendo reiniciado constantemente de algo como o serviço AWS ECS. Nesse cenário, pode ser mais fácil obter o ID hexadecimal do contêiner dos logs no /var/log/ecs/ecs-agent.log.<DATE>. Em seguida, use o docker logs <hex id>.

    • 158
  2. estani
    2014-05-27T01:07:44+08:002014-05-27T01:07:44+08:00

    Bem, o melhor que descobri até agora é:

    #stop the current demon and start it in debug modus
    sudo service docker stop
    dockerd -D # --debug
    

    Basta iniciar o cliente a partir de um novo shell. O equívoco foi pensar que o cliente realmente faz alguma coisa... bem, é apenas se comunicar com o daemon, então você não quer depurar o cliente, mas o próprio daemon (normalmente).

    • 24
  3. claytond
    2016-03-30T05:27:26+08:002016-03-30T05:27:26+08:00

    No meu caso, o -asinalizador (anexar a STDOUT/STDERR) foi suficiente:

    user@machine:~$ docker start -a server_name
    Error: The directory named as part of the path /log/log_path/app.log does not exist.
    For help, use /usr/bin/supervisord -h
    

    Ele mostrou o erro de inicialização (no nosso caso, um caminho de log ausente usado por supervisord). Suponho que a maioria dos erros de inicialização do contêiner também apareça aqui.

    • 22
  4. Andrew Domaszek
    2014-05-20T13:01:42+08:002014-05-20T13:01:42+08:00

    Não posso responder à sua pergunta sobre como tornar a saída do docker mais completa, mas posso dizer que regex no local substituindo uma string em um arquivo .so é um pouco insano: a string só tem tanto espaço alocado para ela e se você alterar os deslocamentos de arquivo de outras entradas, o arquivo elf será corrompido. Tente executar objdump ou readelf em seu arquivo .so depois de executar o comando perl ( antes da alteração de LD_LIBRARY_PATH ) fora de um contêiner - dólares para donuts, agora está corrompido.

    A razão pela qual funciona neste hack tristemente necessário é porque "tmp" e "etc" têm o mesmo comprimento de string, portanto, nenhum deslocamento é alterado. Considere o diretório /dkr ou similar se preferir não usar /tmp.

    Se você DEVE seguir essa abordagem e seus caminhos desejados não puderem ser alterados, reconstrua a biblioteca e altere o caminho padrão para /etc/hosts na fonte. Ou melhor, ao construir seu modificado libnss_files.so, renomeie-o para algo como libnss_altfiles.soe mude nsswitch.confpara usar hosts: altfilesao iniciar seu contêiner docker (a menos que o docker também tenha nsswitch.conf montado em bind, então você não poderá alterá-lo). Isso permitirá que você tenha o libnss_altfiles.so em paralelo com suas bibliotecas normais no sistema base. Se o docker vincular o nsswitch.conf, deixe uma cópia de seu libnss_files.so reconstruído em seu diretório /lib-override pronto para ser carregado por LD_LIBRARY_PATH.

    Como um aviso, os binários suid/sgid ignoram LD_LIBRARY_PATH e LD_PRELOAD, então algumas coisas vão quebrar (leia: volte a usar o /etc/hosts padrão) se você usar essas variáveis.

    • 4
  5. user674669
    2019-03-28T17:30:06+08:002019-03-28T17:30:06+08:00

    Às vezes, você pode encontrar mensagens de erro úteis entrando no nó executando o daemon do docker e fazendo:

    $ tail -f /var/log/containers/* /var/log/docker.log 2>&1
    

    Na 'edição da comunidade Docker' no Mac OS, você pode se conectar ao docker vm fazendo:

    $  screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
    
    • 3

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve