Como reconstruir o container docker no docker-compose.yml?


218

Há escopo de serviços definidos em docker-compose.yml. Estes serviços foram iniciados. Preciso reconstruir apenas um deles e iniciá-lo sem outros serviços. Eu executo os seguintes comandos:

docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it still running !!!
docker-compose build --no-cache nginx 
docker-compose up -d --no-deps # link nginx to other services

No final, eu tenho um velho recipiente nginx. A propósito, o docker-compose não mata todos os contêineres em execução!


4
docker-compose up --build
21719 Jinna Balu

Respostas:


233

docker-compor

$docker-compose up -d --no-deps --build <service_name>

--no-deps - Não inicia serviços vinculados.

--build - Crie imagens antes de iniciar os contêineres.


19
docker-compose build service1 service2 --no-cache faz esse trabalho melhor ( github.com/docker/compose/issues/1049 ). Eu tive problema com recipientes em cache que foram construídas antes de usar docker-compose up -d --no-deps --build <service_name>
evgpisarchik

32
@evgpisarchik As ordens um pouco, deve ser #docker-compose build --no-cache service1 service2
Matthew

180

Com docker-compose 1.19 up

docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Sem um ou mais service_name argumentos, todos os contêineres serão reconstruídos

No menu de ajuda

Options:
    -d, --detach        Detached mode: Run containers in the background,
                        print new container names. Incompatible with
                        --abort-on-container-exit.
    --no-deps           Don't start linked services.
    --force-recreate    Recreate containers even if their configuration
                        and image haven't changed.
    --build             Build images before starting containers.

4
Estou confuso como isso responde à pergunta. Como reconstruímos apenas um contêiner?
Duncan Jones

11
Você pode reconstruir apenas um contêiner anexando seu nome ao final do comando. docker-compose up -d --force-recreate --build container_name
HarlemSquirrel

Espere um segundo, isso recria o contêiner , não é equivalente à build --no-cacheopção, a menos que a descrição do comando esteja completamente errada
Slav

67

Isso deve solucionar seu problema:

docker-compose ps # lists all services (id, name)
docker-compose stop <id/name> #this will stop only the selected container
docker-compose rm <id/name> # this will remove the docker container permanently 
docker-compose up # builds/rebuilds all not already built container 

12
se você quiser stope rmtodos os recipientes, em seguida, você pode usar o comando docker-compose down. Sua solução é melhor se você quiser apenas se livrar de algumas.
Hirowatari 01/10/19

Esta solução é um bom ajuste para a configuração em que você não quer parar todo o aplicativo janela de encaixe e uma apenas recriar dos serviços
bluesummers

Eu precisava realmente executar docker-compose build <id/name>antes uppara reconstruir o Dockerfile alterado.
Vajk Hermecz 20/02

49

Como o @HarlemSquirrel postou, é o melhor e acho que a solução correta.

Mas, para responder ao problema específico do OP, deve ser algo como o seguinte comando, pois ele não deseja recriar TODOS os serviços no docker-compose.ymlarquivo, mas apenas nginxum:

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

Descrição das opções:

Options:
  -d                  Detached mode: Run containers in the background,
                      print new container names. Incompatible with
                      --abort-on-container-exit.
  --force-recreate    Recreate containers even if their configuration
                      and image haven't changed.
  --build             Build images before starting containers.
  --no-deps           Don't start linked services.

9

Talvez essas etapas não estejam totalmente corretas, mas eu faço assim:

parar docker compor: $ docker-compose down

remova o recipiente: $ docker system prune -a

iniciar docker compor: $ docker-compose up -d


4

Basta usar:

docker-compose build [yml_service_name]

Substitua [yml_service_name]pelo seu nome de serviço no docker-compose.ymlarquivo. Você pode usar docker-compose restartpara garantir que as alterações sejam efetuadas. Você pode usar --no-cachepara ignorar o cache.


2

O problema é:

$ docker-compose stop nginx

não funcionou (você disse que ainda está em execução). Se você deseja reconstruí-lo de qualquer maneira, tente matá-lo:

$ docker-compose kill nginx

Se ainda assim não funcionar, tente pará-lo diretamente com o docker:

$ docker stop nginx

ou exclua

$ docker rm -f nginx

Se isso ainda não funcionar, verifique sua versão do docker, você pode querer atualizar.

Pode ser um erro, você pode verificar se um corresponde ao seu sistema / versão. Aqui estão algumas, por exemplo: https://github.com/docker/docker/issues/10589

https://github.com/docker/docker/issues/12738

Como solução alternativa, você pode tentar matar o processo.

$ ps aux | grep docker 
$ kill 225654 # example process id

1

Para mim, apenas buscou novas dependências do Docker Hub com ambos --no-cachee --pull(que estão disponíveis para docker-compose build.

# other steps before rebuild
docker-compose build --no-cache --pull nginx # rebuild nginx
# other steps after rebuild, e.g. up (see other answers)

0
docker-compose stop nginx # stop if running
docker-compose rm -f nginx # remove without confirmation
docker-compose build nginx # build
docker-compose up -d nginx # create and start in background

A remoção do recipiente com rm é essencial. Sem remover, o Docker iniciará o contêiner antigo.


-9

Somente:

$ docker-compose restart [yml_service_name]

4
isso não criará novas alterações. do manual - Se você fizer alterações na configuração do docker-compose.yml, essas alterações não serão refletidas após a execução deste comando.
Denov
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.