Minhas imagens do docker são construídas em um servidor Jenkins CI e enviadas para o nosso Docker Registry privado. Meu objetivo é provisionar ambientes com docker-compose que sempre iniciam o estado originalmente criado das imagens.
Atualmente, estou usando o docker-compose 1.3.2 e 1.4.0 em máquinas diferentes, mas também usamos versões anteriores.
Eu sempre usei os docker-compose pull && docker-compose up -d
comandos para buscar as novas imagens do registro e iniciá-las. Acredito que meu comportamento preferido estava funcionando conforme o esperado até um certo ponto no tempo, mas desde então docker-compose up
começou a executar novamente os contêineres parados anteriormente, em vez de iniciar as imagens originalmente criadas todas as vezes.
Existe uma maneira de se livrar desse comportamento? Poderia ser aquele conectado ao arquivo de configuração docker-compose.yml para não depender de "não esquecer" algo na linha de comando a cada chamada?
ps. Além de encontrar uma maneira de alcançar meu objetivo, eu também gostaria de saber um pouco mais sobre o histórico desse comportamento. Penso que a ideia básica do Docker é construir uma infraestrutura imutável. O comportamento atual do docker-compor parece simplesmente entrar em conflito com essa abordagem .. ou eu perco alguns pontos aqui?
fonte
docker-compose run -d
não existe? Você quer dizerdocker-compose up -d
não?docker-compose pull
antesdocker-compose rm -f
você pode economizar ainda mais tempoA única solução que funcionou para mim foi este comando:
Isso extrairá automaticamente uma nova imagem do repositório e não usará a versão do cache que é pré-compilada com os parâmetros que você já usou antes.
fonte
Pela documentação oficial atual , existe um atalho que interrompe e remove contêineres, redes, volumes e imagens criados por up, se eles já foram parados ou parcialmente removidos e assim por diante, o procedimento também será feito:
Então, se você tiver novas alterações em suas imagens ou arquivos Dockerfiles, use:
Finalmente:
docker-compose up
Em um comando:
docker-compose down && docker-compose build --no-cache && docker-compose up
fonte
docker-compose build --no-cache
será necessário apenas se houver alterações nos Dockerfiles.docker-compose up
, é necessário recriar os serviços comdocker-compose build
.Você pode passar
--force-recreate
paradocker compose up
, que deve usar recipientes novos.Penso que o raciocínio por trás da reutilização de contêineres é preservar quaisquer alterações durante o desenvolvimento. Observe que o Compose faz algo semelhante aos volumes, que também persistirão entre a recreação do contêiner (um contêiner recriado será anexado aos volumes do seu antecessor). Isso pode ser útil, por exemplo, se você tiver um contêiner Redis usado como cache e não desejar perdê-lo toda vez que fizer uma pequena alteração. Outras vezes, é apenas confuso.
Não acredito que exista alguma maneira de forçar isso no arquivo de composição.
Indiscutivelmente, ele colide com princípios de infraestrutura imutáveis. O contra-argumento é provavelmente que você ainda não usa o Compose na produção. Além disso, não tenho certeza se concordo que infra-estrutura imutável é a idéia básica do Docker, embora seja certamente um bom caso de uso / ponto de venda.
fonte
--force-recreate
não trabalho para mim ... Imagem não é puxado mesmo que uma versão mais recente está lá fora ...OU
fonte
Se houver algo novo, ele será reconstruído.
fonte