1

I am using docker-compose for deploying several containers on the same host. My images are built in Google Cloud Build and stored on gcr.io; I am not using docker-compose to build my images.

When I run docker-compose pull followed by docker-compose up -d, new containers are created for my images. However, if I run docker ps in another tab, I observe that my containers go offline for a few seconds while the new ones are being created.

Is there a way to tell docker-compose to recreate and then restart the containers without any downtime?

0

docker-compose up by itself does not support any way of deploying with zero downtime.

https://docs.docker.com/compose/reference/up/

You'll need to implement your own blue/green deployment or have a look at kubernetes's rolling update: https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-intro/

1

Here’s a really simple solution we found for zero downtime, blue–green style deploys with just docker-compose and nginx: https://engineering.tines.com/blog/simple-zero-downtime-deploys.

Turns out, a well-placed bash script is all you need here! This method saved us adding other dependencies to our stack. Here's the central piece:

reload_nginx() {  
  docker exec nginx /usr/sbin/nginx -s reload  
}

zero_downtime_deploy() {  
  service_name=tines-app  
  old_container_id=$(docker ps -f name=$service_name -q | tail -n1)

  # bring a new container online, running new code  
  # (nginx continues routing to the old container only)  
  docker-compose up -d --no-deps --scale $service_name=2 --no-recreate $service_name

  # wait for new container to be available  
  new_container_id=$(docker ps -f name=$service_name -q | head -n1)
  new_container_ip=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $new_container_id)
  curl --silent --include --retry-connrefused --retry 30 --retry-delay 1 --fail http://$new_container_ip:3000/ || exit 1

  # start routing requests to the new container (as well as the old)  
  reload_nginx

  # take the old container offline  
  docker stop $old_container_id
  docker rm $old_container_id

  docker-compose up -d --no-deps --scale $service_name=1 --no-recreate $service_name

  # stop routing requests to the old container  
  reload_nginx  
}

Hope this can help others.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.