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

DockerDocker ComposeDocker Container

Docker Problem Overview


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 Solutions


Solution 1 - Docker

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.

Solution 2 - Docker

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>..]

Solution 3 - Docker

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 

Solution 4 - Docker

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.

Solution 5 - Docker

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

Solution 6 - Docker

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.

Solution 7 - Docker

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)

Solution 8 - Docker

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.

Solution 9 - Docker

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

Solution 10 - Docker

Only:

$ docker-compose restart [yml_service_name]

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionyukliaView Question on Stackoverflow
Solution 1 - DockerdenovView Answer on Stackoverflow
Solution 2 - DockerHarlemSquirrelView Answer on Stackoverflow
Solution 3 - DockerArgonQQView Answer on Stackoverflow
Solution 4 - DockerSlavik MeltserView Answer on Stackoverflow
Solution 5 - DockerSergey IvchenkoView Answer on Stackoverflow
Solution 6 - DockerNexView Answer on Stackoverflow
Solution 7 - DockerkmindiView Answer on Stackoverflow
Solution 8 - DockerFarhadMohseniView Answer on Stackoverflow
Solution 9 - Dockeruser2707671View Answer on Stackoverflow
Solution 10 - DockerALEXANDER GOMEZ HIGUITAView Answer on Stackoverflow