Como continuar um contêiner do Docker que saiu

263

Considerar:

docker run -it centos /bin/bash

Eu pressionei Ctrl+ Dpara sair.

Quero continuar executando este contêiner, mas descobri que não posso.

O único método é

docker commit `docker ps -q -l` my_image
docker run -it my_image /bin/bash

Estou certo? Há um método melhor? (Estou usando a janela de encaixe 0.8.0.)

Daniel YC Lin
fonte
1
Você tentou atribuir um nome ao contêiner e usar esse nome para controlá-lo? A propósito, por "sair", você quer dizer que se destaca, certo?
Eric Platon
12
O Docker é uma ferramenta de programação, pelo menos é assim que eu o uso. Se a maioria discordar, alguém deve dizer ao Docker para não apontar para o StackOverflow como um local para fazer perguntas. Tenho certeza de que essa não é a primeira pergunta do tipo "DevOps" que pode ser usada aqui ou no SuperUser.
Ted M. Young
5
O Docker é uma ferramenta de desenvolvedor. Já é uma tag 'docker' aqui. Então, acho apropriado perguntar no stackoverflow. Eu o uso para criar imagens que exigem compilação do ambiente limpo.
Daniel YC Lin
6
Desejo que as pessoas que marcaram isso como "fora de tópico" expliquem o porquê!
jpetazzo
2
Para suportar esta pergunta como não sendo fora do tópico: meta.stackoverflow.com/q/276579/210336 e meta.stackoverflow.com/q/271279/210336 .
Matthijs Wessels

Respostas:

291

Você pode reiniciar um contêiner existente depois que ele sair e suas alterações ainda estiverem lá.

docker start  `docker ps -q -l` # restart it in the background
docker attach `docker ps -q -l` # reattach the terminal & stdin
Luca G. Soave
fonte
3
para resumir como uma linha: docker start `docker ps -q -l` && docker attach `docker ps -q -l`
Daniel YC Lin
7
Para informar como uma linha: docker start -i $(docker ps -q -l). ;-) A nomeação pode ajudar a controlar melhor qual contêiner está selecionado. -lobter o último, ok ...
Eric Platon
103
Para quem é novo no Linux, a parte `docker ps -q -l`é uma expansão. Ele será substituído pelo ID do último contêiner de janela de encaixe (-l) criado. -q simplesmente suprime outras informações (ao lado do id) normalmente produzidas por `docker ps`. ---- nota: Backtick não é um sinal de cotação, tem um significado muito especial. Tudo o que você digita entre backticks é avaliada (executada) pelo shell antes do comando principal - unix.stackexchange.com/questions/27428/...
bnieland
1
Eu encontrei o contêiner entrando em um estado chamado a Created...partir do qual não pode ser iniciado com a docker start .... No entanto, pode ser reiniciado usando #docker restart ...
Voltaire
2
Nota: -lobtém apenas a janela de encaixe "mais recente". Se você é como eu e docker ps -amostra mais de uma coisa que precisa iniciar, é possível reiniciar "todos" (-a) alterando o comando acima para docker start `docker ps -q -a`. -qapenas o torna "silencioso" (não é o registro de saída).
Rock Lee
148
docker start -a -i `docker ps -q -l`

Explicação:

docker startiniciar um contêiner (requer nome ou ID)
-aanexar ao
-imodo interativo de
docker pscontêiner Listar contêineres
-qlista apenas IDs de contêineres
-llista apenas o último contêiner criado

Paglian
fonte
docker ps -q -l, fornece o ID do contêiner do último criado, mesmo que esteja no status inicial.
Dharmang
qual é o chamado "anexar" ao contêiner? O "anexar"?
skytree
49

Usar:

docker start $(docker ps -a -q --filter "status=exited")

Isso iniciará todos os contêineres que estão no estado encerrado.

docker exec -it <container-id> /bin/bash

Isso se conectará ao contêiner específico.

kgs
fonte
2
Eu achei que esse era o único que funcionava para mim .. devido a essa segunda linha crucial. docker exec -it <container id> /bin/bash(ou apenas bash).
barlop
Isso funcionou para mim, mas eu tenho que executá-lo duas vezes desde que eu tinha dois contêineres. Portanto, se o primeiro iniciar e o segundo receber um erro. basta pressionar o mesmo comando novamente e ele deve iniciar o próximo contêiner.
Andrija J Fourkidney
20

Se você deseja fazê-lo em vários comandos fáceis de lembrar:

  1. lista recipientes parados:

docker ps -a

  1. copie o nome ou o ID do contêiner ao qual deseja anexar e inicie o contêiner com:

docker start -i <name/id>

A -ibandeira diz ao docker para anexar ao stdin do contêiner.

Se o contêiner não foi iniciado com um shell interativo ao qual se conectar, você precisará fazer isso para executar um shell:

docker start <name/id>
docker exec -it <name/id> /bin/sh

O /bin/shshell geralmente está disponível com imagens baseadas em alpinos.

kristianp
fonte
Resposta subestimada, isso me ajudou a encontrar o contêiner que eu estava procurando muito mais fácil do que a "resposta" nesta pergunta.
Nicholas labrecque 17/10/19
3
Error response from daemon: Container <id> is not running
Cerin
14

Se você deseja continuar exatamente um contêiner do Docker com um nome conhecido:

docker start  `docker ps -a -q --filter "name=elas"`
Nelson Dinh
fonte
1
graças @Nelson isso é muito útil para eu começar especial estivador
SACHIN Chavan
Nesse caso, você pode simplesmente executar docker start <name>onde <name> é o nome do seu contêiner. Pelo menos com o docker v19.03.8
Don Foumare
13

Siga esses passos:

  1. Execute o comando abaixo para verificar se todos os serviços de contêiner estão em execução e parados. Opção -aé dada para ver se o contêiner também pára

    docker ps -a
    
  2. Em seguida, inicie o contêiner do docker por container_idnomes de tags ou contêineres

    docker start <CONTAINER_ID> or <NAMES>
    

    insira a descrição da imagem aqui

    Digamos da figura acima, o ID do contêiner 4b161b302337
    Portanto, o comando a ser executado é

    docker start 4b161b302337
    
  3. Pode-se verificar se o contêiner está sendo executado com

    docker ps
    
Anil Jain
fonte
9

Se você tiver um contêiner nomeado, ele poderá ser iniciado executando

docker container start container_name

onde container_name é o nome do container que deve ser fornecido no momento da criação do container. Você pode substituir container_namepelo ID do contêiner, caso o contêiner não seja nomeado. O ID do contêiner pode ser encontrado executando:

docker ps -a
Gaurav Gupta
fonte
5

Esses comandos funcionarão para qualquer contêiner (não apenas os últimos que saíram). Dessa forma, funcionará mesmo após a reinicialização do sistema. Para fazer isso, esses comandos usarão "ID do contêiner".

Passos:

  1. Liste todas as janelas de encaixe usando este comando e observe o ID do contêiner que você deseja reiniciar: docker ps -a

  2. Inicie seu contêiner usando o ID do contêiner: docker start <container_id>

  3. Anexe e execute seu contêiner: docker attach <container_id>

NOTA: Funciona no Linux

Sugandha Jain
fonte
1

pelo nome

sudo docker start bob_the_container

ou por ID

sudo docker start aa3f365f0f4e

isso reinicia o contêiner parado, use -i para anexar o STDIN do contêiner ou, em vez de -i, você pode anexar à sessão do contêiner (se executar com -it)

sudo docker attach bob_the_container
karol wołonciej
fonte
0
docker start `docker ps -a | awk '{print $1}'`

Isso iniciará todos os contêineres que estão no estado 'Exited'

Deepank Varshney
fonte