Docker 中的 Flask 无法检测到 FLASK_ENV

Jak*_*ake 3 flask python-3.x docker

我构建了一个 Flask 应用程序并使用 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" ]
Run Code Online (Sandbox Code Playgroud)

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

if os.environ['FLASK_ENV'] == 'production':
    UPLOAD_URL = '/v1/path/to/production/server'
elif os.environ['FLASK_ENV'] == 'development':
    UPLOAD_URL = '/upload'
Run Code Online (Sandbox Code Playgroud)

但是,启动脚本会导致错误,即使在 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'
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 5

当您运行生成的图像时,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"]
Run Code Online (Sandbox Code Playgroud)