yuklia
yuklia

Reputation: 7803

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

There are scope of services which are defined in docker-compose.yml. These services 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 is still running !!!
docker-compose build --no-cache nginx 
docker-compose up -d --no-deps # link nginx to other services

At the end I get the old nginx container. Docker-compose doesn't kill all running containers!

Upvotes: 684

Views: 1234602

Answers (15)

user5359531
user5359531

Reputation: 3555

all of the services in my docker-compose.yml file were defined with container labels such as some-container:latest. None of the solutions here worked in order to update my docker compose services to the latest versions available publicly. Instead I had to do

docker compose pull
docker compose up -d --force-recreate

After this, all of my running docker compose services were updated to the latest available versions.

Upvotes: 0

HarlemSquirrel
HarlemSquirrel

Reputation: 10114

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

Upvotes: 538

Chels
Chels

Reputation: 191

You can use:

docker-compose build

And if you are using a docker profile:

docker-compose --profile profile_name build

Upvotes: 12

ArgonQQ
ArgonQQ

Reputation: 1997

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 

Upvotes: 94

WolfHunter
WolfHunter

Reputation: 52

It appears you're aiming to rebuild and restart only the nginx service in your Docker Compose setup without affecting other services.I proposed bash script accomplishes this task efficiently. Here's your proposed script:

#!/bin/bash

# Check if the service name is provided
if [ -z "$1" ]; then
    echo "Usage: $0 <service_name>"
    exit 1
fi

# Stop the existing container of the specified service
docker-compose stop "$1"

# Rebuild the specified service
docker-compose build --no-cache "$1"

# Start only the specified service without starting linked services
docker-compose up -d --no-deps "$1"

You can save this script to a file, for example, rebuild_service.sh, make it executable using chmod +x rebuild_service.sh, and then use it to rebuild and restart a specific service in your Docker Compose setup by passing the service name as an argument, like so:

./rebuild_service.sh nginx

Just replace Nginx with the name of the service you want to rebuild and restart. This script ensures that only the specified service is affected, saving time and avoiding unnecessary restarts of other services.

Upvotes: 0

SyLaDe
SyLaDe

Reputation: 77

docker image rm -f nginx

to remove the docker nginx and

docker-compose up -d

to recreate nginx while keeping the other services running

Upvotes: 1

denov
denov

Reputation: 12678

docker-compose up

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

or newer versions of docker

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

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

--build - Build images before starting containers.

Upvotes: 830

MDickten
MDickten

Reputation: 156

I suppose the image named nginx is defined in your docker-compose file. In this case, there is a key/value pair like this: image: repo_name. If this is the case, I suggest pulling the newer image first with docker pull repo_name. Then build the service docker-compose build nginx. This will then use the newly pulled image. Then you can docker-compose up -d nginx.

As a matter of fact, you don't need to stop the container at all while doing this.

(And if you do this a lot, take the trouble to clean out old images occasionally: docker image ls, and then docker image rm <id>for all the images where the value for TAG is <none>. If the image should still be in used regardless, Docker will tell you.)

EDIT: docker-compose stop doesn't "kill" (remove) containers, it just stops them. They're still there somehow, sort of suspended. If you want to really kill, i.e. remove containers, use docker-compose down instead; you'll see from the output that this command really gets rid of the containers.

Upvotes: 2

Sergey Ivchenko
Sergey Ivchenko

Reputation: 1607

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

Upvotes: 24

Nex
Nex

Reputation: 361

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.

Upvotes: 11

kmindi
kmindi

Reputation: 4834

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)

Upvotes: 8

FarhadMohseni
FarhadMohseni

Reputation: 424

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.

Upvotes: 7

Slavik Meltser
Slavik Meltser

Reputation: 10361

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.

Upvotes: 76

Only:

$ docker-compose restart [yml_service_name]

Upvotes: -13

user2707671
user2707671

Reputation: 1704

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

Upvotes: 6

Related Questions