Docker-compose不将环境变量传递给docker容器

时间:2019-10-27 11:30:51

标签: docker docker-compose

我有一个使用环境变量的Python应用程序,我想使用一个Dockerfile和一个docker-compose.yml文件进行dev \ prod设置(仅使用环境变量更改env文件)。

以下是我用来启动应用程序的文件:
Dockerfile

FROM python:3.7-slim-buster
RUN apt-get update

WORKDIR /usr/src/app
RUN mkdir /usr/src/app/excel_users_dump
COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . .
RUN python /usr/src/app/myblumbot/main.py

docker-compose.yml

version: '3'
services:
  bot:
    build:
      context: .
    environment:
      ENV: ${ENV}
      PYTHONPATH: ${PYTHONPATH}
      PYTHONBUFFERED: ${PYTHONBUFFERED}
    volumes:
      - states:/var/myblumbot_states

volumes:
  states:

.env(与docker-compose.yml位于同一目录)

PYTHONBUFFERED=1  
PYTHONPATH=/usr/src/app  
ENV=DEV

我在跑步docker-compose up时 命令,它会生成并告诉我我没有一些环境变量,因此应用程序无法启动。

env = os.environ['ENV'] 

KeyError:'ENV'

但是,如果我在 Dockerfile 中添加ENV VAR value,一切都会很好。

如何从docker-compose和.env文件传递变量?

2 个答案:

答案 0 :(得分:3)

当您使用显示的Dockerfiledocker-compose.yml文件进行设置时,事情将分两个阶段运行。在第一个阶段中,将构建映像,而在第二个阶段中,将实际运行容器。 docker-compose.yml中的大多数设置在构建阶段均无效;其中包括网络设置,环境变量和已发布的端口。

Dockerfile中,您正在运行RUN步骤。这是构建的一部分,而不是执行阶段。最终生成的映像是应用程序退出后生成的文件系统。由于它是在构建阶段,因此环境变量设置不会生效。

如果将RUN更改为CMD,则它将记录在映像中,并且在构建完成之后,它将作为具有环境变量和其他设置的主要容器进程运行。

(在注释中,您建议使用ENTRYPOINT。出于相同的原因,它也可以工作,但是它使一些任务变得更加困难,例如使调试Shell变得更加困难,并且需要标准的Docker首次安装模式ENTRYPOINT是出于自己的目的。我希望这里的CMD。)

答案 1 :(得分:1)

尝试遵循docs

  

Compose支持在以下环境中声明默认环境变量:   名为.env的环境文件放置在   docker-compose命令被执行(当前工作目录)

尝试使用ENTRYPOINT python /usr/src/app/myblumbot/main.py代替RUN...