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?

 170
Author: VonC, 2015-05-13

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:

Em vez de correr com docker 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 .

No entanto, há um problema com a opção -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.

Então isto funcionaria.
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).

 298
Author: VonC, 2017-09-27 08:36:19

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."

 42
Author: cjsimon, 2017-05-23 11:55:19

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.

Querias ir a uma festa? perguntar dentro do contentor? Isso é fácil! 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.

 13
Author: mkasberg, 2018-09-19 20:42:00

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

 11
Author: Pratik, 2015-05-13 08:50:40

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:

Https://docs.docker.com/engine/reference/run/#foreground

 6
Author: jersey bean, 2017-09-27 08:16:58

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
 5
Author: kalyani chaudhari, 2017-06-05 13:16:08

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
 3
Author: Peiming Hu, 2017-10-18 05:18:38

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.

 1
Author: steven87vt, 2017-05-01 15:40:52

Eu expliquei no seguinte post que tem a mesma pergunta.

Como conservar docker alpine container após a "saída" ser utilizada?

 0
Author: vimal krishna, 2018-07-02 09:40:24