Docker - o contêiner não está em execução


88

Eu sou completamente um novato no docker. Tentei iniciar um contêiner encerrado como segue,

  1. Eu listei todos os recipientes disponíveis usando docker ps -a. Ele listou o seguinte:

    docker lista todas as imagens

  2. Entrei nos seguintes comandos para iniciar o container que está no estágio de saída e entrar no terminal daquela imagem.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Ele está gerando o seguinte erro.

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

Mas quando eu começo o contêiner usando docker start 79b3fa70b51d. Ele lança o ID do contêiner como saída, o que é normal se tudo estiver funcionando normalmente. Não tenho certeza do que causa esse erro. Qualquer ideia sobre as causas e sugestões sobre isso seria muito útil para mim. Desde já, obrigado.


7
Olá, Você pode explicar como resolveu esse problema. Receio que a resposta abaixo não faça muito sentido
JayPex

4
@ApexFred, os contêineres do Docker não são como as VMs; eles são projetados para executar um aplicativo. Quando o aplicativo é encerrado, o contêiner também. Nesse caso, o usuário configurou o "aplicativo" do contêiner para o comando "echo". Como o comando "echo" executa um eco e termina, o contêiner também termina com o comando. Se ele iniciar o contêiner novamente, ele executa o eco e termina novamente. O comando EXEC requer um contêiner em execução. Como o contêiner foi encerrado, ele não pode ser usado para executar comandos adicionais.
duct_tape_coder

Respostas:


30

O contêiner 79b3fa70b51dparece fazer apenas um echo.

Isso significa que ele inicia, ecoa e sai imediatamente.

O próximo docker execcomando não o encontraria em execução para se anexar a esse contêiner e executar qualquer comando: é tarde demais. O contêiner já saiu.

O docker execcomando executa um novo comando em um contêiner em execução.

O comando iniciado usando docker execsó será executado enquanto o processo primário do contêiner (PID 1) estiver em execução


1
Olá VonC, obrigado pelo seu comentário. Como posso conseguir entrar no terminal da imagem?
Stranger

3
@Udhayakumar Um simples docker run -it --rm udhayakumar/busyboxwithtouchdeve ser o suficiente para abrir uma sessão. O ponto de entrada padrão deve ser / bin / sh, mas depende do seu Dockerfile: você pode ter definido um ponto de entrada diferente e / ou um CMD diferente.
VonC

50
Olá, você pode explicar como você resolveu esse problema. Temo que esta resposta não faça muito sentido
JayPex

2
@Jawad Ao executar o busyboxwithtouch sem nenhum parâmetro, o padrão é o shell interativo (que não fecha imediatamente). Isso significa que você pode mais tarde ( docker exec) anexar a ele.
VonC

61

Por padrão, o docker container sairá imediatamente se você não tiver nenhuma tarefa em execução no container.

Para manter o contêiner em execução em segundo plano, tente executá-lo com o argumento --detach(ou -d).

Por exemplo:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 

22

Se não for possível reiniciar o processo principal (por tempo suficiente), também existe a possibilidade de commito contêiner para uma nova imagem e executar um novo contêiner a partir dessa imagem. Embora este não seja o fluxo de trabalho de prática recomendada usual , acho realmente útil depurar um script com falha de vez em quando.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#

Eu segui a mesma etapa, mas o contêiner recém-criado não está acessível a partir de um navegador que estava acessível antes
Muhammad Muazzam

1
Observe que o comando inicia um bashprocesso no contêiner. Você provavelmente já teve um servidor da web rodando antes, então terá que verificar qual comando precisa ser usado para trazer o servidor de volta.
Matthias Kuhn

10

Em primeiro lugar, temos que iniciar o contêiner docker

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

Depois disso, verifique o contêiner do docker:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

Em seguida, execute usando o comando abaixo:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 

Seria útil adicionar um texto que ajude a explicar sua resposta.
Lauren Van Sloun

9

Isso acontece com imagens para as quais o script não inicia um serviço aguardando solicitações , portanto, o contêiner sai no final do script.

Este é normalmente o caso com a maioria das imagens básicas do sistema operacional (centos, debian, etc.), ou também com as imagens de nós .

Sua melhor aposta é rodar a imagem no modo interativo . Exemplo abaixo com a imagem do :

docker run -it node /bin/bash

A saída é

root@cacc7897a20c:/# echo $SHELL
/bin/bash

5

Aqui está o que funcionou para mim.

Obtenha o ID do contêiner e reinicie.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

3

A razão é exatamente o que disse a resposta aceita. Acrescento algumas informações extras, que podem fornecer um melhor entendimento sobre este assunto.

  1. O status de um recipiente inclui Created, Running, Stopped, Exited, Deade outros como eu sei.
  2. Quando executamos docker create, o daemon do docker criará um contêiner com seu status de Created.
  3. Quando docker start, o docker daemon iniciará um contêiner existente, cujo status pode ser Createdou Stopped.
  4. Quando executarmos docker run, o daemon do docker o terminará em duas etapas: docker createe docker start.
  5. Quando docker stop, obviamente, o daemon do docker irá parar um contêiner. Assim, o contêiner estaria em Stoppedstatus.
  6. Vindo o mais importante, um contêiner realmente se imagina segurando um processo de longa data nele. Quando o processo termina, o processo de retenção do contêiner também sai. Assim, o status deste contêiner seria Exited.

Quando o processo termina? Em outras palavras, qual é o processo, como o iniciamos?
A resposta está CMDem um dockerfile ou commandna seguinte expressão, que é o bashpadrão em algumas imagens, ou seja, ubutu: 18.04.

docker run ubuntu:18.04 [command]


2

Para qualquer um que tente algo semelhante usando um Dockerfile ...

Executar em modo separado não ajudará. O contêiner sempre sairá (parará de funcionar) se o comando não for bloqueador, esse é o caso do bash.

Nesse caso, uma solução alternativa seria: 1. Confirme a imagem resultante: (container_name = o nome do contêiner no qual deseja basear a imagem, image_name = o nome da imagem a ser criada docker commit container_name image_name 2. Use docker run para criar um novo contêiner usando a nova imagem, especificando o comando que você deseja executar. Aqui, irei executar "bash": docker run -it image_name bash

Isso forneceria o login interativo que você está procurando.


2

docker run -it <image_id> /bin/bash

Executar no modo interativo executando o shell bash


1
Eu acho que a -dbandeira é um erro de digitação aqui?
Ian Buss

1

Esta é uma solução quando o contêiner do docker sai normalmente e você pode editar o Dockerfile.

Geralmente, quando um contêiner docker é executado, um aplicativo é servido executando um comando. Na referência do Dockerfile ,

As instruções CMD e ENTRYPOINT definem qual comando é executado ao executar um contêiner. ... Dockerfile deve especificar pelo menos um dos comandos CMD ou ENTRYPOINT.

Quando você constrói uma imagem e não especifica nenhum comando com CMD ou ENTRYPOINT, o comando CMD ou ENTRYPOINT da imagem base seria executado.

Por exemplo, o Dockerfile oficial do Ubuntu tem CMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ). Agora, o bin/bash/comando pode aceitar a entrada e o docker run -it IMAGE_IDcomando anexa STDIN ao contêiner. O resultado é que você obtém um terminal interativo e o contêiner continua em execução.

Quando um comando com CMD ou ENTRYPOINT é especificado no Dockerfile, esse comando é executado ao executar o contêiner. Agora, se este comando puder terminar sem exigir nenhuma entrada, ele será concluído e o contêiner será encerrado. docker run -it IMAGE_IDvai NÃO fornecer o terminal interativo neste caso. Um exemplo seria a imagem docker construída a partir do Dockerfile abaixo

FROM ubuntu
ENTRYPOINT echo hello 

Se você precisar ir para o terminal desta imagem, você precisará manter o contêiner em execução modificando o comando entrypoint.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Depois de executar o contêiner normalmente com docker run IMAGE_ID, você pode simplesmente ir para outro terminal e usar docker exec -it CONTAINER_ID bashpara obter o terminal do contêiner.


"e você pode editar o Dockerfile": ponto-chave aqui. Votado.
VonC

0

No meu caso, alterei certos nomes de arquivo e nomes de diretório do diretório pai do Dockerfile. Devido a que o container não encontrou os parâmetros necessários para reiniciá-lo.

Depois de renomear de volta para os nomes originais, o contêiner começou como manteiga.


0

Eu tenho uma opinião diferente sobre isso. Pude fazer um docker pse ver que há um contêiner do docker em execução, até tentei reiniciá-lo, mas assim que tentasse obter uma sessão para ele com o New-PSSession -ContainerId $containerId -RunAsAdministratorIt dava um erro, dizendo:

## [erro] New-PSSession: A entrada ContainerId xxx não existe, ## [erro] ou o contêiner correspondente não está em execução.

Meu problema era que eu estava executando o serviço de rede e ele não tinha permissões suficientes para ver o contêiner, embora eu tivesse concedido a ele permissões para executar comandos do docker (com configuração do grupo de segurança do docker)

Eu não sabia como habilitar o trabalho com contêineres, então tive que voltar a executá-lo como um usuário administrador

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.