How to get port of docker-compose from env_file?

13,054

The env_file optin will only set environment variables in the docker container itself. Not on the host which is used during the compose 'build'.

To define your port as env var you should use the .env file as described here

In your case create a .env file which contains::

PORT=5000

and the docker-compose.yml:

version: '3'
services:
  flask:
    build:
      context: ./flask
      dockerfile: Dockerfile_flask
    ports:
     #- "5000:5000"
     - "${PORT}:${PORT}"  # I want to set port defined in the env file
    volumes:
      - ./logs:/app/flask/log
    restart: always

If you want to add environment variable to your container using a env_file you can add it again.

To make it fully clear this example: A postgres started in compose. The environment variables in the my-env-file are known inside the container, the env var inside .env is used during the docker-compose up process.

a .env file with:

PORT=5432

a my-env-file with:

POSTGRES_USER=dev
POSTGRES_PASSWORD=secret
POSTGRES_DB=db

and the docker-compose.yml:

version: ‘3.3’
services:
  postgres:
   image: postgres:9.6
   container_name: postgres
   env_file:
     - my-env-file
   ports:
     - ${PORT}:${PORT}
Share:
13,054
Wilson
Author by

Wilson

Updated on June 15, 2022

Comments

  • Wilson
    Wilson almost 2 years

    I want to use port number defined in env file, is it possible? The below is the content of my docker-compose.yml:

    version: '3'
    services:
      flask:
        build:
          context: ./flask
          dockerfile: Dockerfile_flask
        env_file:
         - env_file.env
        ports:
         #- "5000:5000"
         - "${PORT}:${PORT}"  # I want to set port defined in the env file
        volumes:
          - ./logs:/app/flask/log
        restart: always
    

    And this is the content of env_file.env

    PORT=5000
    

    But some errors raised:

    WARNING: The PORT variable is not set. Defaulting to a blank string.
    ERROR: The Compose file './docker-compose.yml' is invalid because:
    services.flask.ports is invalid: Invalid port ":", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
    

    If it's possible, how should I do it? Thanks

    @lvthillo, thanks for your previous response. But I have another problem that the port can't be accessed in my flask app. The codes are listed as below

    import os
    from flask import Flask
    
    application = Flask(__name__)
    
    print(os.getenv("PORT")) # this is None
    my_port = int(os.getenv("PORT", 5000)) # so my_port here is 5000, but I want it to be 5002 defined in .env
    
    @application.route("/api/test", methods=['POST'])
    def index():
        print('hello')
    
    if __name__ == "__main__":
        application.run(host="0.0.0.0", port=my_port)
    

    Because the flask app need to run with the same port as the container. Is there any way that I can set the port in env file for both docker-compose and my flask app? Thanks

  • Wilson
    Wilson over 5 years
    thanks for response, It did work. But I just found that the port can't be accessed in my flask app. Because I want my flask to run with the same port. Is there any way that I can set the port for both docker-compose and my flask app? Thanks
  • lvthillo
    lvthillo over 5 years
    @Wilson please accept the answer if it was correct. Hm I don't fully understand your question but maybe this will help you: it's a basic flask app running in docker and it's running on a different port than 5000: github.com/lvthillo/python-flask-docker
  • Avner Moshkovitz
    Avner Moshkovitz over 4 years
    @Willson, I have excatly the same problem. How did you end up setting the port inside flask to match the port that is set in Docker?