我有一个使用环境变量的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文件传递变量?
答案 0 :(得分:3)
当您使用显示的Dockerfile
和docker-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...