De acordo com o tutorial que li até agora, o uso " docker run -d
" iniciará um contêiner a partir da imagem e o contêiner será executado em segundo plano. É assim que parece, podemos ver que já temos o ID do contêiner.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Mas se eu corri " docker ps
", nada foi retornado.
Então eu tentei " docker ps -a
", posso ver o container já encerrado:
root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz
Algo que fiz de errado? Como posso solucionar esse problema?
docker run -it -d <image> /bin/bash
isso inicia um shell bash interativamente e não fecha o contêiner porque o processo do shell está ativo.Respostas:
O arquivo de docker centos possui um comando padrão
bash
.Isso significa que, quando executado em background (
-d
), o shell sai imediatamente.Atualização 2017
Versões mais recentes do authorize janela de encaixe para executar um recipiente tanto no modo independente e em modo de primeiro plano (
-t
,-i
ou-it
)Nesse caso, você não precisa de nenhum comando adicional e isso é suficiente:
O bash aguardará em segundo plano.
Que foi inicialmente relatada em Kalyani-chaudhari 's resposta e detalhado na camisa de feijão ' s resposta .
Observe que, para os alpinos , Marinos An relata nos comentários :
Resposta original (2015)
Conforme mencionado neste artigo :
Então, isso funcionaria:
A
docker ps
mostraria o contêiner de centos ainda em execução.A partir daí, você pode anexá-lo ou desanexá-lo (ou
docker exec
alguns comandos).fonte
docker exec -it <yourContainer> bash
.De acordo com esta resposta , adicionar o
-t
sinalizador impedirá a saída do contêiner ao executar em segundo plano. Você pode usardocker exec -i -t <image> /bin/bash
para entrar em um prompt de shell.Parece que a opção -t não está muito bem documentada , embora a ajuda diga que "aloca um pseudo-TTY".
fonte
tail -f /dev/null
docker run -t -d --name mysql -p 3306:3306 mysql
- não funciona para mim (ubuntu 14.04.5): STATUS = Saído (1) 4 segundos atrásfundo
Um contêiner do Docker executa um processo (o "comando" ou "ponto de entrada") que o mantém ativo. O contêiner continuará sendo executado enquanto o comando continuar sendo executado.
No seu caso, o comando (
/bin/bash
por padrão,centos:latest
ativado) sai imediatamente (como o bash faz quando não está conectado a um terminal e não tem nada para executar).Normalmente, quando você executa um contêiner no modo daemon (com
-d
), o contêiner está executando algum tipo de processo daemon (comohttpd
). Nesse caso, enquanto o daemon httpd estiver em execução, o contêiner permanecerá ativo.O que você parece estar tentando fazer é manter o contêiner vivo sem que um processo daemon seja executado dentro do contêiner. Isso é um pouco estranho (porque o contêiner não está fazendo nada útil até você interagir com ele, talvez com
docker exec
), mas há certos casos em que pode fazer sentido fazer algo assim.(Você quis chegar a um prompt do bash dentro do contêiner? Isso é fácil!
docker run -it centos:latest
)Solução
Uma maneira simples de manter um contêiner ativo no modo daemon indefinidamente é executar
sleep infinity
como o comando do contêiner. Isso não depende de coisas estranhas, como alocar um TTY no modo daemon. Embora dependa de fazer coisas estranhas, como usarsleep
como seu comando principal.Solução alternativa
Conforme indicado por cjsimon, a
-t
opção aloca um "pseudo-tty". Isso ajuda a continuar executando indefinidamente, porque pensa que está conectado a um TTY interativo (mesmo que você não tenha como interagir com esse TTY em particular, se não for aprovado-i
). De qualquer forma, isso também deve funcionar:Não tenho 100% de certeza se
-t
produzirá outras interações estranhas; talvez deixe um comentário abaixo, se houver.fonte
infinity
.Olá, esse problema ocorre porque os contêineres do docker saem se não houver aplicativo em execução no contêiner.
A opção é apenas executar um contêiner no modo deamon.
Portanto, o truque para tornar seu contêiner em execução contínua é apontar para um arquivo shell no docker que manterá seu aplicativo em execução. Você pode tentar com um arquivo start.sh
Este start.sh deve apontar para um aplicativo sem fim.
Caso você não queira que nenhum aplicativo esteja em execução, você pode instalar o
monit
que manterá o contêiner do docker em execução. Informe-nos se esses dois casos funcionaram para você manter seu contêiner em funcionamento.Muito bem sucedida
fonte
Você pode realizar o que deseja com:
ou
ou
O parâmetro de comando, conforme sugerido por outras respostas (ou seja, tail -f / dev / null) é totalmente opcional e NÃO é necessário para que seu contêiner permaneça em execução em segundo plano.
Observe também que a documentação do Docker sugere que a combinação das opções -i e -t fará com que ele se comporte como um shell.
Vejo:
https://docs.docker.com/engine/reference/run/#foreground
fonte
Eu tenho esse snippet de código executado
ENTRYPOINT
no arquivo docker:Execute a imagem da janela de encaixe incorporada como:
Efetue login no shell do contêiner:
fonte
execute o comando da seguinte maneira:
Se você deseja especificar porta, então comando como abaixo:
verifique o contêiner em execução usando o seguinte comando:
fonte
-t -d
vs-i -d
? Ambos manterão o contêiner em funcionamento.O Docker requer que seu comando continue em execução em primeiro plano. Caso contrário, ele acha que seus aplicativos param e encerram o contêiner.
Portanto, se o script de entrada do docker for um processo em segundo plano, como a seguir:
O '&' faz o contêiner parar e sair se não houver outro processo em primeiro plano acionado posteriormente. Portanto, a solução é apenas remover o '&' ou executar outro CMD em primeiro plano , como
fonte
touch
esse arquivo primeiro, caso não encontre um arquivo de log.O contêiner do Docker sai se a tarefa interna for concluída; portanto, se você quiser mantê-lo ativo, mesmo que não tenha nenhum trabalho ou já os tenha concluído, é possível
docker run -di image
. Depois quedocker container ls
você o verá em execução.fonte
Talvez seja só eu, mas no CentOS 7.3.1611 e no Docker 1.12.6, mas acabei tendo que usar uma combinação das respostas postadas por @VonC e @Christopher Simon para que isso funcione de maneira confiável. Nada que eu fiz antes disso impediria a saída do contêiner após a execução do CMD com êxito. Estou iniciando o oracle-xe-11Gr2 e o sshd.
Dockerfile
Em seguida, adicione -d -t e -i para executar
Finalmente, depois de horas batendo minha cabeça contra a parede
Por qualquer motivo, o acima será encerrado após a execução do CMD se a cauda -f for removida ou se alguma das opções -t -d -i for omitida.
fonte
Eu expliquei no seguinte post que tem a mesma pergunta.
Como reter o contêiner alpino do docker após a "saída" ser usada?
fonte
Eu tive o mesmo problema, basta abrir outro terminal com uma festança para mim:
criar contêiner:
contêiner de início:
inicie o bash para manter o contêiner em execução:
Para iniciar o processo, você precisa:
fonte
Se você estiver usando o CMD no final do Dockerfile, o que você pode fazer é adicionar o código no final. Isso só funcionará se o seu docker for construído no ubuntu ou em qualquer sistema operacional que possa usar o bash.
Resumidamente, o final do seu Dockerfile será algo como isto.
Portanto, se você tiver algo em execução automaticamente depois de executar sua imagem do docker e quando a tarefa for concluída, o terminal bash estará ativo dentro do docker. Assim, você pode inserir seus comandos do shell.
fonte
A execução da janela de encaixe com o modo interativo pode resolver o problema.
Aqui está o exemplo para executar imagens com e sem o modo interativo
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
ID DE RECIPIENTE COMANDO DE IMAGEM NOMES DE PORTAS DE STATUS CRIADAS
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
ID DO RECIPIENTE COMANDO DE IMAGEM CRIADO NOMES DE PORTAS DE ESTADO c3d6a9529fd7 test_again1.0 "bash" 2 segundos atrás Acima 1 segundo awesome_haibt
fonte
se você deseja operar no contêiner, é necessário executá-lo em primeiro plano para mantê-lo vivo.
fonte
A ordem dos argumentos é importante
A resposta de Jersey Beans (todos os 3 exemplos) funcionou para mim. Após várias tentativas e erros, percebi que a ordem dos argumentos importa.
Mantém o contêiner em execução em segundo plano:
docker run -t -d <image-name>
Mantém o contêiner em execução em primeiro plano:
docker run <image-name> -t -d
Não era óbvio para mim, proveniente de um histórico do Powershell.
fonte