How to reload environment variables in docker-compose container with minimum downtime?

DockerDocker Compose

Docker Problem Overview


docker-compose.yml

version: '2'
services:
  app:
    build:
      context: .
    command: python src/app.py
    restart: on-failure
    depends_on:
      - db
    environment:
      - TJBOT_DB_HOST=db
      - TJBOT_API_KEY
      - TJBOT_AUTO_QUESTION_TIME
    env_file:
      - .env
  db:
    image: mongo:3.0.14
    volumes:
      - mongodbdata:/data/db
volumes:
  mongodbdata:

If I change the .env file, how could I reload the container to use the new environment variables with minimum downtime?

Docker Solutions


Solution 1 - Docker

If you are running the yml with docker-compose, you can just run docker-compose up -d and it will recreate any containers that have changes and leave all unchanged services untouched.

$ cat docker-compose.env2.yml
version: '2'

services:
  test:
    image: busybox
    # command: env
    command: tail -f /dev/null
    environment:
      - MY_VAR=hello
      - MY_VAR2=world
  test2:
    image: busybox
    command: tail -f /dev/null
    environment:
      - MY_VAR=same ole same ole

$ docker-compose -f docker-compose.env2.yml up -d                                               
Creating network "test_default" with the default driver
Creating test_test_1
Creating test_test2_1

$ vi docker-compose.env2.yml # edit the file to change MY_VAR

$ docker-compose -f docker-compose.env2.yml up -d
Recreating test_test_1
test_test2_1 is up-to-date

If you run the containers as a docker stack deploy -c docker-compose.yml with a version 3 file format, you can do a rolling update of the service which will prevent any downtime if you have multiple instances of your service running. This functionality is still very new, you'll want 1.13.1 to fix some of the issues with updates, and as with anything this new, bugs are still being worked out.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMarcos Costa PintoView Question on Stackoverflow
Solution 1 - DockerBMitchView Answer on Stackoverflow