Compose: docker-compose up não reconstrói a imagem, embora o Dockerfile tenha mudado

Criado em 30 mai. 2015  ·  11Comentários  ·  Fonte: docker/compose

Muitas vezes, docker-compose up não reconstrói a imagem especificada como "build:" no docker-compose.yml, embora o respectivo Dockerfile tenha mudado. Em vez disso, preciso executar docker build -t servicename_foldername. manualmente para o serviço afetado que realmente atualizará a imagem de acordo.

Isso é intencional? Por ser bastante irritante, nunca posso ter certeza de que a imagem está realmente atualizada e preciso executar o docker build manualmente antes de usar o docker-compose up.

kinquestion

Comentários muito úteis

É verdade que docker-compose up nunca reconstrói uma imagem. Isso é "intencional", mas é algo que devemos mudar: # 693

Você pode executar docker-compose build para construir as imagens.

Duplicado de # 614

Todos 11 comentários

É verdade que docker-compose up nunca reconstrói uma imagem. Isso é "intencional", mas é algo que devemos mudar: # 693

Você pode executar docker-compose build para construir as imagens.

Duplicado de # 614

Ei @dnephin , que mundo pequeno!

Estou tendo um problema em que docker-compose build não está reconstruindo os contêineres corretamente. Isso está causando problemas para impedir que um contêiner de Varnish seja iniciado devido a arquivos de bloqueio obsoletos.

Com base no que li em outro lugar (por exemplo, # 1195), parece que docker-compose build é a maneira recomendada de reconstruir contêineres e deve evitar problemas como esses.

╭─wting<strong i="11">@nuc</strong> ~/code/reddit-mobile ‹python-2.7.12› ‹wting_chan-159_add_varnish_to_2X×ad20b6d›
╰─➤  docker ps                                                                                                              2016.09.15 12:20:46 PDT 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
╭─wting<strong i="12">@nuc</strong> ~/code/reddit-mobile ‹python-2.7.12› ‹wting_chan-159_add_varnish_to_2X×ad20b6d›
╰─➤  docker-compose --version                                                                                               2016.09.15 12:20:48 PDT 
docker-compose version 1.8.0, build f3628c7
╭─wting<strong i="13">@nuc</strong> ~/code/reddit-mobile ‹python-2.7.12› ‹wting_chan-159_add_varnish_to_2X×ad20b6d›
╰─➤  docker --version                                                                                                       2016.09.15 12:20:51 PDT 
Docker version 1.12.1, build 23cf638
╭─wting<strong i="14">@nuc</strong> ~/code/reddit-mobile ‹python-2.7.12› ‹wting_chan-159_add_varnish_to_2X×ad20b6d›
╰─➤  docker-compose build && docker-compose up                                                                          2 ↵ 2016.09.15 12:23:35 PDT 
Building web
Step 1 : FROM reddit/reddit-nodejs:latest
 ---> ee57c186eb35
Step 2 : VOLUME /src
 ---> Using cache
 ---> 3720601d98c8
Step 3 : WORKDIR /src
 ---> Using cache
 ---> d4b9b360ef4e
Step 4 : EXPOSE 4444
 ---> Using cache
 ---> 5e232be73781
Step 5 : ENTRYPOINT npm start
 ---> Using cache
 ---> 1094fc9857bb
Successfully built 1094fc9857bb
Building varnish
Step 1 : FROM quay.io/reddit/varnish-fastly
# Executing 1 build trigger...
Step 1 : COPY default.vcl /etc/varnish/default.vcl
 ---> Using cache
 ---> ac9dadb35674
Step 2 : ENV VARNISH_PORTS 8080
 ---> Using cache
 ---> 3c43e0226f5f
Step 3 : EXPOSE 8080
 ---> Using cache
 ---> c88093c2ff32
Successfully built c88093c2ff32
Starting redditmobile_web_1
Starting redditmobile_varnish_1
Attaching to redditmobile_web_1, redditmobile_varnish_1
varnish_1  | storage_malloc: max size 100 MB.
varnish_1  | SHMFILE owned by running varnishd master (pid=1)  # STALE LOCK FILE
varnish_1  | (Use unique -n arguments if you want multiple instances.)
web_1      | 
web_1      | > [email protected] start /src
web_1      | > NODE_ENV=production npm run server
web_1      | 
redditmobile_varnish_1 exited with code 2
web_1      | 
web_1      | > [email protected] server /src
web_1      | > NODE_ENV=production node ./bin/ProductionServer.js
web_1      | 
web_1      | Started cluster with 4 processes.
web_1      | Started server at PID 31
web_1      | Started server at PID 46
[..]

ei @wting

Acho que o que pode estar acontecendo é que o arquivo de bloqueio está em um volume (https://docs.docker.com/compose/overview/#/preserve-volume-data-when-containers-are-created).

Você pode tentar docker-compose down para remover os recipientes antigos, o que removerá a referência de volume. O próximo up deve começar com novos volumes.

Se não estiver em um volume, acho que pode ser que a fechadura nunca tenha sido removida. O Compose tentará iniciar um contêiner se ele existir e a configuração não tiver mudado, portanto, executar down deve corrigir isso.

Obrigado! docker-compose down funcionou, assim como docker-compose up --force-recreate (mas não docker-compose --build ). Suponho que não seja intuitivo porque há um volume montado para o contêiner da web, mas não o contêiner do Varnish; ainda assim, os arquivos do Varnish permanecem. Aqui está o arquivo docker-compose.yml :

version: '2'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
     - "4444:4444"
    volumes:
     - .:/src
  varnish:
    build:
      context: .
      dockerfile: Dockerfile.varnish
    ports:
    - "4301:80"
    depends_on:
    - web

Para contexto:

Obrigado, e todos aqueles que escreveram sobre este assunto, fui "salvo" pelo seu comentário => "docker-compose up --force-recreate (mas não docker-compose --build)."

docker-compose up --build

É verdade que docker-compose up nunca reconstrói uma imagem. Isso é "intencional", mas é algo que devemos mudar: # 693

Você pode executar docker-compose build para construir as imagens.

Duplicado de # 614

Obrigado, isso realmente me ajudou a atribuir um novo Dockerfile e reconstruir o contêiner com as últimas alterações

Para sua informação - teve o mesmo problema e a mesma correção discutida. As interwebs me trouxeram aqui. Obrigado pelas boas discussões!

docker-compose up --build -V

Para esclarecer o que é o parâmetro -V :
-V, --renew-anon-volumes Recreate anonymous volumes instead of retrieving data from the previous containers.

Para reconstruir uma única imagem dentro de docker-compose :

docker-compose up -d --force-recreate --no-deps --build $service

por exemplo:

docker-compose up -d --force-recreate --no-deps --build varnish

Esta página foi útil?
5 / 5 - 1 avaliações