Como reiniciar um único contêiner com docker-compose

333

Eu tenho um docker-compose.ymlarquivo que contém 4 contêineres: redis, postgres, api, worker

Durante o desenvolvimento do worker, muitas vezes preciso reiniciá-lo para aplicar as alterações. Existe alguma maneira de reiniciar um contêiner (por exemplo worker) sem reiniciar os outros contêineres?

Bryan Chen
fonte
2
docker-compor -f estivador-compose.yml restart trabalhador
Jinna Balu

Respostas:

398

É muito simples: use o comando:

docker-compose restart worker

Você pode definir o tempo para esperar pela parada antes de matar o contêiner (em segundos)

docker-compose restart -t 30 worker

Observe que isso reiniciará o contêiner, mas sem reconstruí-lo. Se você deseja aplicar suas alterações e reiniciar, dê uma olhada nas outras respostas.

bmkrio
fonte
3
para mim funcionou, mas uma pergunta geral, se permitida aqui: 'reiniciar' cuida de contêineres vinculados e atualiza os / etc / hosts ou um 'reiniciar' não altera nenhum IP?
michabbb
Os contêineres são vinculados por nome e, normalmente, o único IP com o qual você precisa se preocupar é o IP do host da janela de encaixe externa (normalmente 192.168.99.100). Onde pode haver algum problema é se, por exemplo, você reiniciar um contêiner de banco de dados ao qual outros contêineres estão conectados. Os contêineres dependentes terão que ser resilientes o suficiente para se reconectar.
Ryan Kimber
20
O OP afirma que ele precisa "reiniciá-lo para aplicar as alterações". De acordo com a documentação, os docker-compose restartcomandos NÃO aplicarão nenhuma alteração. "Se você fizer alterações na sua docker-compose.ymlconfiguração, essas alterações não serão refletidas após a execução deste comando." Portanto use docker-compose up -d --build. docs.docker.com/compose/reference/restart
featherbelly
5
nb, trabalhador é o nome dado ao serviço no arquivo yaml e não qualquer coisa que você vê ao executardocker ps -a
WORC
2
Essa outra resposta é muito melhor stackoverflow.com/a/39501539/292408 , pois restartnão aplica alterações, mesmo se você já executou uma docker-compose build <container name>e esta é uma resposta incorreta / que não funciona.
Elijah Lynn
170

As outras respostas para reiniciar um único nó estão no destino docker-compose restart worker,. Isso devolverá esse contêiner, mas não incluirá alterações, mesmo que você o tenha reconstruído separadamente. Você pode manualmente stop, rm, create, e start, mas há muito mais fácil métodos.

Se você atualizou seu código, pode criar e recarregar em uma única etapa com:

docker-compose up --detach --build

Isso reconstruirá suas imagens primeiro a partir de qualquer código alterado, o que é rápido se não houver alterações desde a reutilização do cache. E então substitui apenas os contêineres alterados. Se as imagens baixadas estiverem obsoletas, você poderá preceder o comando acima com:

docker-compose pull

Para baixar as imagens alteradas primeiro (os contêineres não serão reiniciados até que você execute um comando como o upacima). Fazer uma parada inicial é desnecessário.

E para fazer isso apenas em um único serviço, siga o comando up ou pull com os serviços que você deseja especificar, por exemplo:

docker-compose up --detach --build worker

Aqui está um exemplo rápido da primeira opção, o Dockerfile é estruturado para manter as partes do código que mudam frequentemente no final. De fato, os requisitos são extraídos separadamente, pip installpois esse arquivo raramente muda. E como os contêineres nginx e redis estavam atualizados, eles não foram reiniciados. O tempo total para todo o processo foi inferior a 6 segundos:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s
BMitch
fonte
Isso é interessante, mas poderia ser usado junto com a -no-cacheopção? Say I acrescentou algo em meu package.jsone necessidade de re RUN npm installmas a Dockerfilesi não mudou
Augustin Riedinger
2
@augustinriedinger Se o seu arquivo de entrada for alterado e você o incluir em um COPYcomando, isso interromperá o cache automaticamente.
BMitch 29/09/17
1
@augustinriedinger thanks. Sou móvel, por isso não consigo ver as perguntas vinculadas. Nas etapas da sua pergunta, você já deve ter um COPYcomando no seu Dockerfile. O git pullatualizará o arquivo package.json eo cache de construção vai quebrar quando estivador vê você copia em um arquivo diferente.
BMitch 29/09/17
1
Obrigado não sabia sobre esse comportamento! Eu estava usando em ADDvez de, COPYmas aparentemente a última é uma prática recomendada, então eu vou em frente!
Augustin Riedinger 29/09
1
O @augustinriedinger ADDterá o mesmo resultado que COPYo travamento do cache, mas (conforme sugerido no link de práticas recomendadas) a maioria não precisa de recursos extras, por isso nem me importo de mencioná-lo.
BMitch 29/09
28

Para reiniciar um serviço com alterações, aqui estão as etapas que eu executei:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker
Jeff
fonte
10
Se você precisar de alterações para aplicar a uma construção, você pode facilmente fazer uma docker-compose up -d --builde ela reconstruirá tudo e reiniciará qualquer contêiner alterado. Não há necessidade de parar primeiro, com tempo de inatividade e separar os comandos criar e iniciar.
BMitch 15/09/16
4
Sim, se você deseja reiniciar todos os serviços, mas o OP só deseja reiniciar um único serviço e não os outros
Jeff
3
Veja a resposta que eu publiquei, no exemplo, o upwill recriou apenas o contêiner que foi alterado e, portanto, precisava ser reiniciado.
BMitch 16/09/16
18

Seguindo o comando

docker-compose restart worker

irá parar e iniciar o contêiner. ou seja, sem carregar nenhuma alteração no docker-compose.xml

STOP é semelhante à hibernação no PC. Portanto, stop / start não procurará nenhuma alteração feita no arquivo de configuração. Para recarregar a receita do container (docker-compose.xml), precisamos remover e criar o container (analogia semelhante à reinicialização do PC)

Portanto, os comandos serão os seguintes

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation
Mr Coder
fonte
+1, muito obrigado! A rmopção de linha -fé útil (sem prompt) e com a janela de encaixe atual createe starté mesclada como up(portanto, no total, temos 3 comandos e não 4), e a upopção -dé útil (a execução é em segundo plano).
Astrowalker 26/12/19
10

Reinicie o serviço com o arquivo docker-compose

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

Caso de uso nº 1: se COMPOSE_FILE_NAME for docker-compose.ymle o serviço for trabalhador

docker-compose restart worker

Caso de uso 2: se o nome do arquivo for sample.ymle o serviço for trabalhador

docker-compose -f sample.yml restart worker

Por padrão, docker-compose procura docker-compose.ymlse executarmos o docker-composecomando, caso contrário, temos sinalizador para fornecer um nome de arquivo específico com-f [FILE_NAME].yml

Jinna Balu
fonte
7

O comando 'docker' simples não sabe nada sobre o contêiner 'worker'. Use comando como este

docker-compose -f docker-compose.yml restart worker

Shtlzut
fonte
4
não funciona - novas alterações ao coker-compose.yml não se aplicados na reinicialização
JLee
3

Reiniciar contêiner

Se você deseja apenas reiniciar seu contêiner:

docker-compose restart servicename

Pense neste comando como "apenas reinicie o contêiner pelo nome", que é equivalente ao docker restartcomando.

Observe advertências:

  1. Se você alterou as variáveis ​​ENV, elas não serão atualizadas no contêiner. Você precisa parar e começar de novo. Ou, usar o comando único docker-compose updetectará alterações e recriará o contêiner.

  2. Como muitos outros mencionados, se você alterou docker-compose.ymlo próprio arquivo, a reinicialização simples não aplicará essas alterações.

  3. Se você copiar seu código dentro do contêiner no estágio de compilação (no Dockerfileuso de ADDou COPYcomandos), toda vez que o código for alterado, será necessário reconstruir o contêiner ( docker-compose build).

Correlação com o seu código

docker-compose restartdeve funcionar perfeitamente bem, se o seu código for mapeado para a diretiva container by volume da seguinte docker-compose.ymlmaneira:

services:

  servicename:
    volumes:
      - .:/code

Mas eu recomendo usar o recarregamento de código ativo, que provavelmente é fornecido por sua estrutura de escolha no modo DEBUG (como alternativa, você pode procurar pacotes de recarregamento automático no idioma de sua escolha). A adição disso deve eliminar a necessidade de reiniciar o contêiner sempre que o código for alterado, em vez de recarregar o processo.

Lev Rubel
fonte
1

A resposta aqui está falando sobre o reflexo da alteração no arquivo docker-compose.yml.

Mas e se eu quiser incorporar as alterações que fiz no meu código e acredito que isso só será possível com a reconstrução da imagem e com os seguintes comandos

1. batente do contêiner do docker

docker stop container-id

2. remoção de contêiner do docker

docker rm container-id

3. remoção da imagem do docker

docker rmi image-id

4. componha o recipiente novamente

docker-compose up container-name
Anshul Sharma
fonte