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

cho*_*opa 10 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
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

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

volumes:
  states:
Run Code Online (Sandbox Code Playgroud)

.env(在与 docker-compose.yml 相同的目录中)

PYTHONBUFFERED=1  
PYTHONPATH=/usr/src/app  
ENV=DEV
Run Code Online (Sandbox Code Playgroud)

当我运行 docker-compose up 命令时,它会构建并告诉我我没有一些环境变量,因此应用程序无法启动。

env = os.environ['ENV'] 
Run Code Online (Sandbox Code Playgroud)

密钥错误:'ENV'

但是,如果我添加ENV VAR valueDockerfile,一切工作良好。

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

Dav*_*aze 19

当您像展示的那样同时使用 aDockerfiledocker-compose.yml文件进行设置时,事情会分两个阶段运行。在第一阶段构建镜像,在第二阶段容器实际运行。 中的大多数设置在docker-compose.yml构建阶段都不起作用;其中包括网络设置、环境变量和已发布的端口。

在您DockerfileRUN一步中,您正在运行您的应用程序。这是构建的一部分,而不是执行阶段;最终生成的图像是应用程序退出后产生的文件系统。由于处于构建阶段,环境变量设置不生效。

如果更改RUNCMD,那么这将被记录在映像中,并且在构建完成后,它将作为主容器进程运行,并具有环境变量和其他设置。

(在您建议的评论中ENTRYPOINT。出于同样的原因,这也可以工作,但它会使一些任务变得更加困难,例如使调试 shell 更难,并且有一个标准的 Docker 首次设置模式需要ENTRYPOINT用于其自身目的。我会更喜欢CMD这里。)


rok*_*rok 4

尝试遵循文档

Compose 支持在名为 .env 的环境文件中声明默认环境变量,该文件位于执行 docker-compose 命令的文件夹(当前工作目录)中

尝试使用ENTRYPOINT python /usr/src/app/myblumbot/main.py而不是RUN...