Reuse containers with `docker-compose`

2019-02-23 11:19发布

问题:

I've an app running on multiple Docker containers defined by docker-compose. Everything works fine from my user and the docker-compose ps output looks like:

       Name                Command           State     Ports
------------------------------------------------------------
myuser_app_1    /config/bootstrap.sh   Exit 137
myuser_data_1   sh                     Exit 0
myuser_db_1     /run.sh                Exit 143

Now I'm trying to run docker-compose up with supervisord (see relevant part of supervisord.conf below) and the issue is that the containers are now named myapp_app_1, myapp_data_1 and myapp_db_1, that is they're created from scratch and all customizations on the former containers is lost.

I tried renaming the containers, but it gives an error saying that there's already a container with that name.

Q: Is there some way to force docker-compose reuse existing containers instead of creating new ones based in their respective images?

supervisord.conf

...
[program:myapp]
command=/usr/local/bin/docker-compose
    -f /usr/local/app/docker-compose.yml up
redirect_stderr=true
stdout_logfile=/var/log/myapp_container.log
stopasgroup=true
user=myuser

回答1:

Compose will always reuse containers as long as their config hasn't changed.

If you have any state in a container, you need to put that state into a volume. Containers should be ephemeral, you should be able to destroy them and recreate them at any time without losing anything.

If you need to initialize something I would do it in the Dockerfile, so that it's preserved in the image.