As a newbie to the tooling, docker-compose it's great for getting started. To bring up all the service containers with a simple docker-compose up
starts everything. However, what if you want to replace an existing container without tearing down the entire suite of containers?
For example: I have a docker-compose
project that has the following containers.
- Node JS App
- CouchDB
- Redis Cache
I had a small configuration change within the CouchDB container that I wanted to update and re-start to get going but wasn't sure how to do that.
Here's how I did it with little down time.
I'm hoping there are better ways to go about this (I'm still learning), but the following steps are what I used to replace a running docker container with the latest build.
- Make the necessary change to the container (in my case update the couchdb config).
- Run
docker-compose build couchdb
(docker-compose build <service_name>
whereservice_name
is the name of the docker container defined in yourdocker-compose.yml
file.)
Once the change has been made and container re-built, we need to get that new container running (without affecting the other containers that were started by docker-compose).
docker-compose stop <service_name>
<-- If you want to live on the edge and have the shut-down go faster, trydocker-compose kill <service_name>
docker-compose up -d --no-deps <service_name>
<-- this brings up the service using the newly built container.
The -d
is Detached mode: Run containers in the background, print new container names.
The --no-deps
will not start linked services.
That's it... at least for me, it's worked to update my running containers with the latest version without tearing down the entire docker-compose set of services.
Again, if you know of a faster/better way to go about this, I'd love to hear it. Or if you know of any down-sides to this approach, I'd love to hear about it before I have to learn the hard way on a production environment.
UPDATE:
Thanks to Vladimir in the comments below - you can skip several steps above and do it with a single command
docker-compose up -d --no-deps --build <service_name>
I tested this and was able to avoid the build
, kill
, and up
commands with this one-liner.
Happy Container Updating!