Eu tenho um docker-compose.yml
arquivo 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?
docker
docker-compose
Bryan Chen
fonte
fonte
Respostas:
É muito simples: use o comando:
Você pode definir o tempo para esperar pela parada antes de matar o contêiner (em segundos)
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.
fonte
docker-compose restart
comandos NÃO aplicarão nenhuma alteração. "Se você fizer alterações na suadocker-compose.yml
configuração, essas alterações não serão refletidas após a execução deste comando." Portanto usedocker-compose up -d --build
. docs.docker.com/compose/reference/restartdocker ps -a
restart
não aplica alterações, mesmo se você já executou umadocker-compose build <container name>
e esta é uma resposta incorreta / que não funciona.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 manualmentestop
,rm
,create
, estart
, mas há muito mais fácil métodos.Se você atualizou seu código, pode criar e recarregar em uma única etapa com:
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:
Para baixar as imagens alteradas primeiro (os contêineres não serão reiniciados até que você execute um comando como o
up
acima). 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:
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 install
pois 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:fonte
-no-cache
opção? Say I acrescentou algo em meupackage.json
e necessidade de reRUN npm install
mas aDockerfile
si não mudouCOPY
comando, isso interromperá o cache automaticamente.COPY
comando no seu Dockerfile. Ogit pull
atualizará o arquivo package.json eo cache de construção vai quebrar quando estivador vê você copia em um arquivo diferente.ADD
vez de,COPY
mas aparentemente a última é uma prática recomendada, então eu vou em frente!ADD
terá o mesmo resultado queCOPY
o 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.Para reiniciar um serviço com alterações, aqui estão as etapas que eu executei:
fonte
docker-compose up -d --build
e 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.up
will recriou apenas o contêiner que foi alterado e, portanto, precisava ser reiniciado.Seguindo o comando
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
fonte
rm
opção de linha-f
é útil (sem prompt) e com a janela de encaixe atualcreate
estart
é mesclada comoup
(portanto, no total, temos 3 comandos e não 4), e aup
opção-d
é útil (a execução é em segundo plano).Reinicie o serviço com o arquivo docker-compose
Caso de uso nº 1: se COMPOSE_FILE_NAME for
docker-compose.yml
e o serviço for trabalhadorCaso de uso 2: se o nome do arquivo for
sample.yml
e o serviço for trabalhadorPor padrão, docker-compose procura
docker-compose.yml
se executarmos odocker-compose
comando, caso contrário, temos sinalizador para fornecer um nome de arquivo específico com-f [FILE_NAME].yml
fonte
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
fonte
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 restart
comando.Observe advertências:
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 up
detectará alterações e recriará o contêiner.Como muitos outros mencionados, se você alterou
docker-compose.yml
o próprio arquivo, a reinicialização simples não aplicará essas alterações.Se você copiar seu código dentro do contêiner no estágio de compilação (no
Dockerfile
uso deADD
ouCOPY
comandos), 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 restart
deve funcionar perfeitamente bem, se o seu código for mapeado para a diretiva container by volume da seguintedocker-compose.yml
maneira: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.
fonte
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
2. remoção de contêiner do docker
3. remoção da imagem do docker
4. componha o recipiente novamente
fonte