Hide
Hide

Reputation: 3317

docker-compose set environment variable doesn't work

I use docker and also use docker-compose for tie each container.

In my python flask code, refer environment variable like this.

import os

from app import db, create_app


app = create_app(os.getenv('FLASK_CONFIGURATION') or 'development')

if __name__ == '__main__':
    print(os.getenv('FLASK_CONFIGURATION'))
    app.run(host='0.0.0.0', debug=True)

And docker-compose.yml here.

version: '3.7'

services:
  nginx:
    build: 
      context: .
      dockerfile: docker/nginx/dockerfile
    container_name: nginx
    hostname: nginx-prod
    ports:
      - '80:80'
    networks: 
      - backend
    links:
      - web_project
    depends_on:
      - web_project
    environment:
      - FLASK_CONFIGURATION=production

  mongodb:
    build:
      context: .
      dockerfile: docker/mongodb/dockerfile
    container_name: mongodb
    hostname: mongodb-prod
    ports:
      - '27017:27017'
    networks:
      - backend

  web_project:
    build:
      context: .
      dockerfile: docker/web-prod/dockerfile
    container_name: web_project
    hostname: web_project_prod
    ports:
      - '5000:5000'
    networks:
      - backend
    tty: true
    depends_on:
      - mongodb
    links:
      - mongodb
    environment:
      - FLASK_CONFIGURATION=production

networks: 
  backend:
    driver: 'bridge'

I set FLASK_CONFIGURATION=production via environment command.

But when I execute, maybe FLASK_CONFIGURATION=production doesn't work.

I also tried to ENV FLASK_CONFIGURATION production to each dockerfile. (doesn't work too)

Strange thing is, When I enter to my container via bash(docker exec -it bash) and check the environment variable with export, it was set perfectly.

Is there any wrong code in my docker settings?

Thanks.

Upvotes: 2

Views: 1417

Answers (2)

Hide
Hide

Reputation: 3317

[SOLVED]

It is caused by supervisor.

When using supervisor, it's shell is isolated with original.

So we have to define our environment variables into supervisor.conf

Upvotes: 1

shushu304
shushu304

Reputation: 1498

Your flask code is looks ok, and as you said ... in bash this ENV variable exists,

My advice to you is to find way to put this variable to .env file in your project.

I will explain why i'm saying it regarding similar issue that i had with cron:

The cron run in his "own world" because the system run and execute it, and because of it he don't share those ENV variables that the bash of the main container process holding.

So i assume (please give feed back if not) that flask run too in similar way in his "own world" and don't have access to those ENV that Docker set.

So, there for, i created bash script that read all ENV variable and write them to the .env file of the project, this script run after the container created.

In this way, no matter from where and how you run the code/script ... those ENV variables will always be exists.

Upvotes: 0

Related Questions