【问题标题】:unable to access environment variables from docker compose env file无法从 docker compose env 文件访问环境变量
【发布时间】:2020-07-17 09:20:31
【问题描述】:

我在从 docker-compose.yml 文件(版本 -3.7)读取 .env 变量时遇到问题,这里首先解释我的文件夹和示例代码结构

我的文件夹结构

my_app

  • src

    • config.py
    • app.py
    • requirements.txt
    • 其他文件
  • Dockerfile

  • docker-compose.yml

  • .env

.env 文件

这是我的示例 .env 文件



    ENVIRONMENT_NAME=DEV
    DATABASE_NAME=testing

docker-compose.yml 文件

这是我的示例 docker-compose.yml 文件(版本:3.7)



    version: "3.7"
    services:
        my_app_test:
            env_file: ./.env
            image: my-app-test
            build:
                context: ./src
                dockerfile: Dockerfile

Dockerfile

这是我的示例 Dockerfile



    FROM python:3.7-alpine
    
    # Install required packages
    RUN apk add --update --no-cache \
        build-base \
        postgresql-dev \
        linux-headers \
        pcre-dev \
        py-pip \
        bash \
        curl \
        openssl \
        nginx \
        libressl-dev \
        musl-dev \
        libffi-dev \
        rsyslog \
        && pip install Cython
    
    # Create container's working directory
    RUN mkdir -p /MyApp
    # Copy all source files to the container's working directory
    COPY ./ /MyApp
    # Install all python dependency libs
    RUN pip install -r /MyApp/requirements.txt
    
    WORKDIR /MyApp
    ENTRYPOINT ["python3"]

src/config.py

这里在配置文件中,我正在读取所有的环境变量



    import os
    from pathlib import Path    
    from dotenv import load_dotenv
    
    ENV_PATH = Path('.env')
    load_dotenv(dotenv_path=ENV_PATH)
    
    ENVIRONMENT_NAME = os.getenv('ENVIRONMENT_NAME')
    DATABASE_NAME = os.getenv("DATABASE_NAME")

src/app.py

在 app.py 文件中,我从 config.py 获取变量并在我的项目中使用它。当我在构建 docker 映像后运行此文件时,它没有按预期工作。所有 env 变量都被读取为 None



    import config
    import os
    
    print(config.ENVIRONMENT_NAME)
    print(config.DATABASE_NAME)
    
    # Access all environment variables
    print('\n')
    print(os.environ)

我正在尝试从 docker-compose 文件而不是 Dockerfile 访问环境集。

Docker 构建工作正常,之后当我尝试运行 docker 映像时(sudo docker run my-app-test app.py)它不打印如我所料的环境变量。 当前代码的输出是

没有任何 没有任何 environ({'PATH': '/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'HOSTNAME': '6cfc0c912772','LANG':'C.UTF-8','GPG_KEY':'0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D','PYTHON_VERSION':'3.7.5','PYTHON_PIP_VERSION':'19.3.1_THIPURL:'https ://github.com/pypa/get-pip/raw/ffe826207a010164265d9cc807978e3604d18ca0/get-pip.py”, 'PYTHON_GET_PIP_SHA256': 'b86f36cc4345ae87bfd4f10ef6b2dbfa7a872fbff70608a1e43944d283fd0eee', 'HOME': '/根'})

要求是,

  1. python=3.7
  2. python-dotenv==0.12.0

我想解决这个环境读取问题。我不确定问题出在哪里,@anyone 请帮我解决这个问题。

【问题讨论】:

    标签: python python-3.x docker docker-compose dockerfile


    【解决方案1】:

    您没有在构建时设置 ENV,因此 docker-compose 将能够在您在 compose 文件中设置配置时读取 env file,但 docker run 不会读取 env,因为您需要指定 @987654324 @

    需要在 docker run 命令中指定env-file

    docker run --env-file .env my-app-test app.py
    

    或者只是检查 ENV

    docker run --env-file .env --entrypoint printenv my-app-test
    

    或运行堆栈

    docker-compose up
    

    【讨论】:

    • @CHIDAMBARANATHANM 它应该可以工作,如果还有问题请告诉我
    【解决方案2】:

    docker run 将找不到 env 文件,因为在 docker-compose.yml 文件中指定了 env 文件。

    尝试像这样运行您的容器:

    docker-compose run my_app_test app.py
    

    【讨论】:

    • 上面的评论给出了这个错误,ERROR: No such service: my-app-test @Peaceful James
    • 我已经编辑了我的答案。它必须是 docker-compose 文件中的服务名称。使用下划线而不是连字符。
    猜你喜欢
    • 2019-08-02
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2015-06-17
    相关资源
    最近更新 更多