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 value在Dockerfile,一切工作良好。
如何从 docker-compose 和 .env 文件传递变量?
Dav*_*aze 19
当您像展示的那样同时使用 aDockerfile和docker-compose.yml文件进行设置时,事情会分两个阶段运行。在第一阶段构建镜像,在第二阶段容器实际运行。 中的大多数设置在docker-compose.yml构建阶段都不起作用;其中包括网络设置、环境变量和已发布的端口。
在您Dockerfile的RUN一步中,您正在运行您的应用程序。这是构建的一部分,而不是执行阶段;最终生成的图像是应用程序退出后产生的文件系统。由于处于构建阶段,环境变量设置不生效。
如果更改RUN为CMD,那么这将被记录在映像中,并且在构建完成后,它将作为主容器进程运行,并具有环境变量和其他设置。
(在您建议的评论中ENTRYPOINT。出于同样的原因,这也可以工作,但它会使一些任务变得更加困难,例如使调试 shell 更难,并且有一个标准的 Docker 首次设置模式需要ENTRYPOINT用于其自身目的。我会更喜欢CMD这里。)
| 归档时间: |
|
| 查看次数: |
6605 次 |
| 最近记录: |