Auto remove container with docker-compose.yml
I haven't found any option to help you define this behavior in the docker-compose.yml
file and I think the explanation is the that it will break how some of the docker-compose ...
commands are supposed to work.
More on this up
/down
, start
/stop
thing:
docker-compose up
builds, (re)creates, starts, and attaches to containers for a service.
Since your images
are built and the containers
of your service have started, you can then use docker-compose stop
and docker-compose start
to start/stop your service. This is different from docker-compose down
which:
Stops containers and removes containers, networks, volumes, and images created by
up
.
Problem with what you are trying to do:
If you docker-compose up
and one of your containers finishes its task and gets (auto)removed, then you can't docker-compose stop
and docker-compose start
again. The removed container will not be there to start
it again.
You might want to take a look at:
- docker-compose: option to automaticaly remove container after run in docker-compose.yml
- What is the difference between docker-compose up and docker-compose start?
Simply run docker-compose up && docker-compose rm -fsv
ð
ð https://docs.docker.com/compose/reference/rm
It's been quite some time since this question was posted, but I thought it would be informative to share something that worked for my case, in 2022 :) But keep in mind that this solution still does not remove old containers, as the original author intended to achieve.
docker-compose up --force-recreate -V
In my case, I have a small Redis cluster where I want the data to be completely erased after I stop the servers.
Only using --force-recreate
didn't do the trick, because the anonymous volume is still reused. That's where -V
comes in.
My solution to this was to create a little bash script that automatically removes containers afterwards.
If you're on macOS, you can put this script in usr/local/bin
. Assuming it's named dco
, you can then run chmod +x usr/local/bin/dco
to make it executable. On Windows, I have no idea how to get this working, but on Linux it should be similar.
#! /bin/bash
# check for -d, --detached
DETACHED=false
for (( i=1; i <= "$#"; i++ )); do
ARG="${!i}"
case "$ARG" in
-d|--detach)
DETACHED=true
break
;;
esac
done
if [[ $1 == "run" ]] && [[ $DETACHED == false ]]; then
docker-compose run --rm "${@:2}"
elif [[ $1 == "up" ]] && [[ $DETACHED == false ]]; then
docker-compose up "${@:2}"; docker-compose down
else
docker-compose "${@:1}"
fi
Edit: Updated the script so that detached mode will work normally, added break
to the loop suggested by artu-hnrq