Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to restart a single container with docker-compose

I have a docker-compose.yml file that contains 4 containers: redis, postgres, api and worker.

During the development of the worker container, I often need to restart it in order to apply changes. Is there any good way to restart a single container (e.g. worker) without restarting the others?

like image 321
Bryan Chen Avatar asked Jul 16 '15 23:07

Bryan Chen


People also ask

Does Docker compose up restart container?

The docker compose start command is useful only to restart containers that were previously created, but were stopped. It never creates new containers.

How do you stop a single container?

To stop one or more running Docker containers, you can use the docker stop command. The syntax is simple: $ docker stop [OPTIONS] CONTAINER [CONTAINER...] You can specify one or more containers to stop.


2 Answers

The other answers to restarting a single node are on target, docker-compose restart worker. That will bounce that container, but not include any changes, even if you rebuilt it separately. You can manually stop, rm, create, and start, but there are much easier methods.

If you've updated your code, you can do the build and reload in a single step with:

docker-compose up --detach --build 

That will first rebuild your images from any changed code, which is fast if there are no changes since the cache is reused. And then it only replaces the changed containers. If your downloaded images are stale, you can precede the above command with:

docker-compose pull 

To download any changed images first (the containers won't be restarted until you run a command like the up above). Doing an initial stop is unnecessary.

And to only do this for a single service, follow the up or pull command with the services you want to specify, e.g.:

docker-compose up --detach --build worker 

Here's a quick example of the first option, the Dockerfile is structured to keep the frequently changing parts of the code near the end. In fact the requirements are pulled in separately for the pip install since that file rarely changes. And since the nginx and redis containers were up-to-date, they weren't restarted. Total time for the entire process was under 6 seconds:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build Building counter Step 1 : FROM python:2.7-alpine  ---> fc479af56697 Step 2 : WORKDIR /app  ---> Using cache  ---> d04d0d6d98f1 Step 3 : ADD requirements.txt /app/requirements.txt  ---> Using cache  ---> 9c4e311f3f0c Step 4 : RUN pip install -r requirements.txt  ---> Using cache  ---> 85b878795479 Step 5 : ADD . /app  ---> 63e3d4e6b539 Removing intermediate container 9af53c35d8fe Step 6 : EXPOSE 80  ---> Running in a5b3d3f80cd4  ---> 4ce3750610a9 Removing intermediate container a5b3d3f80cd4 Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0  ---> Running in 0d69957bda4c  ---> d41ff1635cb7 Removing intermediate container 0d69957bda4c Successfully built d41ff1635cb7 counter_nginx_1 is up-to-date counter_redis_1 is up-to-date Recreating counter_counter_1  real    0m5.959s user    0m0.508s sys     0m0.076s 
like image 38
BMitch Avatar answered Sep 22 '22 21:09

BMitch


It is very simple: Use the command:

docker-compose restart worker 

You can set the time to wait for stop before killing the container (in seconds)

docker-compose restart -t 30 worker 

Note that this will restart the container but without rebuilding it. If you want to apply your changes and then restart, take a look at the other answers.

like image 117
bmkrio Avatar answered Sep 23 '22 21:09

bmkrio