首页 > 解决方案 > Docker 中的 Flask 无法检测到 FLASK_ENV

问题描述

我构建了一个烧瓶应用程序并使用 Dockerfile 在 docker 中启动它,如下所示。

FROM python:3.7

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .
WORKDIR /app

CMD export FLASK_ENV=production    
ENTRYPOINT [ "python", "-u", "app.py" ]

在烧瓶应用程序中,我指定了一些用于开发和生产的配置

if os.environ['FLASK_ENV'] == 'production':
    UPLOAD_URL = '/v1/path/to/production/server'
elif os.environ['FLASK_ENV'] == 'development':
    UPLOAD_URL = '/upload'

但是,启动脚本会导致错误,即使在 Dockerfile 中设置了该命令,容器也无法检测到 FLASK_ENV。任何人都可以帮忙吗?

Traceback (most recent call last):
  File "app.py", line 14, in <module>
    import config
  File "/app/config.py", line 14, in <module>
    if os.environ['FLASK_ENV'] == 'production':
  File "/usr/local/lib/python3.7/os.py", line 681, in __getitem__
    raise KeyError(key) from None
KeyError: 'FLASK_ENV'

标签: python-3.xdockerflask

解决方案


当您运行生成的图像时,ENTRYPOINT它们CMD会组合成一个命令。您描述的CMD将被包装起来sh -c,然后作为命令行参数传递给您命名为ENTRYPOINT.

(在您的应用程序中,尝试打印出sys.argv。您应该会看到它包含["app.py", "/bin/sh", "-c", "export ..."]。)

如果要为映像设置环境变量,则需要 DockerfileENV指令。(例如,您不能RUN export ...;您以这种方式设置的任何变量都将在行尾丢失RUN。)

ENV FLASK_ENV=production    
CMD ["python", "-u", "app.py"]

推荐阅读