O container do acoplador irá parar automaticamente após "docker run-d"
de acordo com o tutorial que li até agora, o uso de "{[[2]}" irá iniciar um contentor a partir da imagem, e o contentor irá correr em segundo plano. É assim que parece, podemos ver que já temos a identificação do contentor.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Mas se eu fugisse "docker ps
", nada foi devolvido.
Por isso tentei."docker ps -a
", consigo ver um contentor já a sair.
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
Fiz alguma coisa errada? Como posso resolver este problema?
9 answers
O ficheiro dockerfile dos centos tem um comando predefinido bash
.
Isso significa que, quando executado em segundo plano (-d
), a concha sai imediatamente.
Actualizar 2017
Versões Mais recentes do encaixe autorizar para executar um recipiente, tanto em destacado modo e em modo de primeiro plano (-t
, -i
ou -it
)
Nesse caso, não precisas de nenhum comando adicional e isto é suficiente:
docker run -t -d centos
A festa vai esperar no ... fundo.Isso foi inicialmente relatado em kalyani-chaudhari 'S respostae detalhado em jersey bean'S resposta.
vonc@voncvb:~$ d ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a50fd9e9189 centos "/bin/bash" 8 seconds ago Up 2 seconds wonderful_wright
Resposta Original (2015)
Tal como mencionado em Este artigo:
Então isto funcionaria.Em vez de correr com
No entanto, há um problema com a opçãodocker run -i -t image your-command
, recomenda-se a utilização de-d
porque pode executar o seu contentor com apenas um comando e não precisa de desligar o terminal do contentor carregando em Ctrl + P + Q .-d
. o seu contentor pára imediatamente, a menos que os comandos não estejam em primeiro plano.
O Docker requer o seu comando para continuar a correr em primeiro plano. Caso contrário, ele pensa que suas aplicações para e desligar o recipiente.O problema é que alguma aplicação não funciona em primeiro plano. Como podemos facilitar?
Nesta situação, pode adicionar
tail -f /dev/null
a às suas ordens.
Ao fazer isto, mesmo que o seu comando principal corra em segundo plano, o seu contentor não pára porque a cauda continua a correr em primeiro plano.
docker run -d centos tail -f /dev/null
A docker ps
mostraria o contentor de centos ainda a funcionar.
De lá, você pode anexar a ele ou separar dele (ou docker exec
alguns comandos).
De acordo com esta resposta, a adição da bandeira -t
impedirá que o contentor saia ao correr em segundo plano. Você pode então usar docker exec -i -t <image> /bin/bash
para entrar em um prompt shell.
docker run -t -d <image> <command>
Parece que a opção-t não está muito bem documentada {[[6]}, embora a ajuda diga que "atribui uma pseudo-TTY."
Antecedentes
Um Contentor de Estivador executa um processo (o" comando "ou" entrypoint") que o mantém vivo. O container continuará a correr enquanto o comando continuar a correr.
No seu caso, o comando (/bin/bash
, por omissão, em centos:latest
) está a sair imediatamente (como faz bash quando não está ligado a um terminal e não tem nada para executar).
Normalmente, quando você executa um contentor no modo de servidor (com -d
), o contentor está a correr algum tipo de servidor processo (como httpd
). Neste caso, enquanto o servidor httpd estiver em execução, o container permanecerá vivo.
O que parece estar a tentar fazer é manter o contentor vivo sem um processo de servidor a correr dentro do contentor. Isto é um pouco estranho (porque o recipiente não está fazendo nada útil até que você interaja com ele, talvez com docker exec
), mas há certos casos em que pode fazer sentido fazer algo assim.
docker run -it centos:latest
)
Solução
Uma forma simples de manter um contentor vivo no modo de servidor indefinidamente é executar sleep infinity
como comando do contentor. Isto não depende de fazer coisas estranhas como distribuir um TTY no modo de servidor. 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 pelo cjsimon, a opção -t
atribui um "pseudo-tty". Este truque bash em continuar a correr indefinidamente porque pensa que está ligado a um TTY interativo (mesmo que você não tenha nenhuma maneira de interagir com esse TTY em particular se você não passar -i
). De qualquer forma, isto também deve servir.
$ docker run -t -d centos:latest
Não tenho 100% de certeza se {[10] } produzirá outras interacções estranhas; talvez deixe um comentário abaixo se produzir.
Esta questão é porque os contentores do docker saem se não houver nenhuma aplicação em execução no contentor.
-d
A opção é apenas executar um contentor no modo deamon.
Então o truque para fazer o seu contentor continuar a correr é apontar para um ficheiro shell no docker que irá manter a sua aplicação em execução.Você pode tentar com um start.sh ficheiro
Eg: docker run -d centos sh /yourlocation/start.sh
Isto start.sh deve apontar para uma aplicação interminável.
No caso de não querer que qualquer aplicação seja em execução, poderá instalar monit
que manterá o seu contentor acoplado a funcionar.
Por favor, avise-nos se estes dois casos funcionarem para manter o seu contentor a funcionar.
Tudo de bom
Podes conseguir o que quiseres com:
docker run -t -d <image-name>
Ou
docker run -i -d <image-name>
Ou
docker run -it -d <image-name>
O parâmetro de comando tal como sugerido por outras respostas (ou seja, tail-f /dev/null) é completamente opcional, e não é necessário para que o seu contentor continue a funcionar em segundo plano.
Note também que a documentação do acoplador sugere que a combinação de opções i E t fará com que se comporte como um concha.
Ver:
Executar o comando da seguinte forma:
docker run -t -d <image-name>
Se quiser indicar porto, então comando do seguinte modo:
docker run -t -d -p <port-no> <image-name>
Verifique o contentor em execução com o seguinte comando:
docker ps
O Acker necessita do seu comando para continuar a correr em primeiro plano. Caso contrário, ele pensa que suas aplicações para e desligar o recipiente.
Por isso, se o seu programa de entrada do 'docker' for um processo de fundo como o seguinte:
/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &
O ' & ' faz com que o contentor pare e saia se não houver outro processo principal despoletado mais tarde. Então a solução é apenas remover o ' & ' ou ter outro CMD principal a correr depois dele {[[9]}, como
tail -f server.log
Talvez seja só eu, mas nos CentOS 7.3.1611 e no Docker 1.12.6 mas acabei por ter de usar uma combinação das respostas postadas por @VonC & @Christopher Simon para pôr isto a funcionar de forma fiável. Nada do que eu fiz antes disso impediria o recipiente de sair depois que ele correu CMD com sucesso. Vou iniciar oracle-xe-11Gr2 e sshd.
Ficheiro Dockerfile
...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null
Depois adicionar-d-t e-i para correr
docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611
Finalmente, depois de horas a bater com a cabeça contra o ... parede
ssh -v [email protected] -p 5022
...
[email protected]'s password:
debug1: Authentication succeeded (password).
Por qualquer razão, o que precede irá sair depois de executar CMD se a cauda-f for removida, ou se qualquer das opções-t-d-i for omitida.
Eu expliquei no seguinte post que tem a mesma pergunta.
Como conservar docker alpine container após a "saída" ser utilizada?