Docker: adicione uma política de reinicialização a um contêiner que já foi criado

229

Vejo que o Docker adicionou algo chamado políticas de reinicialização para lidar com a reinicialização de contêineres em caso de, por exemplo, reiniciar.

Embora isso seja muito útil, vejo que o comando restart policy apenas funciona com docker rune não docker start. Então, minha pergunta é:

Existe alguma maneira de adicionar políticas de reinicialização a um contêiner que já foi criado no passado?

Tenda Enrique Moreno
fonte
Você deve alterar a resposta aceita para a de @Yale Huang. A resposta aceita está incorreta nas versões atuais do docker. Entendo que a resposta possa ter ajudado você na época, mas agora é enganosa.
Stepan Vavra
2
Feito. Obrigado pelo aviso.
Enrique Moreno Tent

Respostas:

574

Nas versões recentes do docker (a partir de 1.11), você tem um updatecomando:

docker update --restart=always <container>
Pau Ruŀlan Ferragut
fonte
9
Parece que isso foi adicionado no Docker 1.11.0.
phansen
@phansen: De fato era .
precisa saber é o seguinte
4
Deve ser a resposta aceita com a ressalva de que funciona como no Docker 1.11.
21417 JohnDoe
6
com janela de encaixe 17,09 eu tive que correr docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatically
HarlemSquirrel
4
docker updateaceita vários IDs de contêiner, portanto, não é necessário xargs, basta fazê-lo docker update --restart=always $(docker ps -q).
markusk
49

Existem duas abordagens para modificar o RestartPolicy:

  • Descubra o ID do contêiner, pare todo o serviço do docker, modifique /var/lib/docker/containers/CONTAINER_ID/hostconfig.json, defina RestartPolicy -> Name como "always" e inicie o serviço do docker.
  • docker commit seu contêiner como uma nova imagem, pare e mova o contêiner atual e inicie um novo contêiner com a imagem.
Yale Huang
fonte
2
parar o contêiner, editar, iniciar o contêiner. Funciona como um encanto. Não sei por que a edição está desativada.
névoa
2
Finalmente, uma resposta razoável :)
Navin
Trabalhou para mim em um servidor antigo com o docker 1.10 (não pergunte 😱). Infelizmente, docker updatepermite modificar a política de reinicialização apenas em 1.11+
Igor Kupczyński
1

O uso da --restart=alwayspolítica manipulará a reinicialização de contêineres existentes em caso de reinicialização.

O problema é que, se há vários recipientes com --restart=alwaysquando você executa imagem de uma versão mais recente como discutido na janela de encaixe - como você desabilitar o reinício automático em um recipiente? .

Tentar remover automaticamente o contêiner quando ele existir pela opção de venda docker run --rmtambém apresentará problemas com a --restart=always política, pois eles conflitam .

$ docker run --rm --restart always <image>
Conflicting options: --restart and --rm

Portanto, neste caso, é melhor escolher outra opção: - reinicie a política a menos que seja interrompida .

$ docker run --rm --restart unless-stopped <image>

Esta política não conflitantes a docker run --rm, mas como explicado na documentação janela de encaixe :

É semelhante a --restart=always, exceto que, quando o contêiner é parado (manualmente ou de outra forma) , ele não é reiniciado mesmo após a reinicialização do daemon do Docker.

Portanto, ao usar esta --restart unless-stoppedpolítica, para garantir que a reinicialização esteja funcionando, caso pare por acidente ao fechar o terminal, faça uma vez em outro terminal, como abaixo:

$ docker ps
$ docker restart <container>

Aguarde até que o processo de extermínio termine no shell anterior, feche-o e saia ( não saia ).
E verifique novamente no terminal restante se o contêiner ainda estiver em execução:

$ docker ps

Se ainda estiver em execução, você poderá reiniciar com segurança e verificar novamente se o aplicativo está sendo reiniciado e se a janela de encaixe está limpa sem o uso de vários contêineres.

Chetabahana
fonte