ChatGPT解决这个技术问题 Extra ChatGPT

How to rebuild docker container in docker-compose.yml?

There are scope of services which defined in docker-compose.yml. These service have been started. I need to rebuild only one of these and start it without up other services. I run the following commands:

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

At the end i got old nginx container. By the way docker-compose doesn't kill all running containers !

docker-compose up --build
Just to clarify upper comment: docker-compose up --build rebuild all containers. Use docker-compose up --build <service_name> as stated in @denov comment.
docker-compose up --build <service_name> does not work if you have a docker-compose.yml with containers coming from a container-registry
docker-compose build --no-cache when you want to build from the first level.
Should be easy to get these semantics straight (not you @yuklia - the compose team). Not sure why we still struggle with this in this millennium.

p
phoenix

docker-compose up

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

--no-deps - Don't start linked services.

--build - Build images before starting containers.


@evgpisarchik The orders a bit out, it should be docker-compose build --no-cache service1 service2
why y'all talking about service? the question was to rebuild container not service
@temirbek container inside compose is defined under services block
S
Scott Stafford

With docker-compose 1.19 up

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

Without one or more service_name arguments all images will be built if missing and all containers will be recreated.

From the help menu

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.

Without cache

To force a rebuild to ignore cached layers, we have to first build a new image

docker-compose build --no-cache [<service_name>..]

From the help menu

Options:
    --force-rm              Always remove intermediate containers.
    -m, --memory MEM        Set memory limit for the build container.
    --no-cache              Do not use cache when building the image.
    --no-rm                 Do not remove intermediate containers after a successful build.

Then recreate the container

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

I'm confused how this answers the question. How do we rebuild just the one container?
You can rebuild only one container by appending it's name to the end of the command. docker-compose up -d --force-recreate --build container_name
Wait a sec, this recreates container, it is not equivalent to build --no-cache option, unless the command description is completely wrong
t
tristanbailey

This should fix your problem:

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 

if you want to stop and rm all containers then you can use the command docker-compose down. Your solution is better if you only want to get rid of some.
This solution is a good fit for the setup where you don't want to stop the entire docker application and just recreate one of the services
I needed to actually run docker-compose build <id/name> before up to rebuild the changed Dockerfile.
S
Slavik Meltser

As @HarlemSquirrel posted, it is the best and I think the correct solution.

But, to answer the OP specific problem, it should be something like the following command, as he doesn't want to recreate ALL services in the docker-compose.yml file, but only the nginx one:

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

Options description:

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.

S
Sergey Ivchenko

Maybe these steps are not quite correct, but I do like this:

stop docker compose: $ docker-compose down

WARNING: The following prune -a will delete all images, you may not want this as it could effect other projects. you can read more here

remove the container: $ docker system prune -a

start docker compose: $ docker-compose up -d


docker system prune -a will delete all images, even ones for other projects. I would recommend against using this.
aL_eX, flag -a (means all) you can select only the one you need by specifying its id
@aL_eX I agree this method is somewhat dangerous. But this is working for sure. Other answers do not remove images.
I edited your answer, adding a warning. <3. Hope you don't mind.
Brandon Bertelsen, ok, but to remove all images use -a (--all) - "Remove all unused images not just dangling ones"
N
Nex
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

Removing container with rm is essential. Without removing, Docker will start old container.


k
kmindi

For me it only fetched new dependencies from Docker Hub with both --no-cache and --pull (which are available for 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)

F
FarhadMohseni

Simply use :

docker-compose build [yml_service_name]

Replace [yml_service_name] with your service name in docker-compose.yml file. You can use docker-compose restart to make sure changes are effected. You can use --no-cache to ignore the cache.


u
user2707671

The problem is:

$ docker-compose stop nginx

didn't work (you said it is still running). If you are going to rebuild it anyway, you can try killing it:

$ docker-compose kill nginx

If it still doesn't work, try to stop it with docker directly:

$ docker stop nginx

or delete it

$ docker rm -f nginx

If that still doesn't work, check your version of docker, you might want to upgrade.

It might be a bug, you could check if one matches your system/version. Here are a couple, for ex: https://github.com/docker/docker/issues/10589

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

As a workaround, you could try to kill the process.

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

A
ALEXANDER GOMEZ HIGUITA

Only:

$ docker-compose restart [yml_service_name]

this will not build new changes. from the manual - If you make changes to your docker-compose.yml configuration these changes will not be reflected after running this command.