fundo
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 (como httpd
). 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 usar sleep
como seu comando principal.
$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d651c7a9e0ad centos:latest "sleep infinity" 2 seconds ago Up 2 seconds nervous_visvesvaraya
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:
$ docker run -t -d centos:latest
Não tenho 100% de certeza se -t
produzirá outras interações estranhas; talvez deixe um comentário abaixo, se houver.