在docker python中缺少环境变量:3使用docker-compose

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在docker python中缺少环境变量:3使用docker-compose相关的知识,希望对你有一定的参考价值。

虽然我的配置看起来不错,但我的python:3图像似乎没有预期的DJANGO_SECRET_KEY设置,至少在Dockerfile尝试运行迁移时

$ docker-compose config
services:
  api:
    build:
      context: /Users/ben/Projects/falcon/falcon-backend
      dockerfile: Dockerfile
    depends_on:
    - db
    - redis
    environment:
      DJANGO_SECRET_KEY: 'some-secret-that-works-elsewhere'
$
$ docker-compose up --build api
[...]
 Step 6/7 : RUN echo `$DJANGO_SECRET_KEY`
 ---> Running in fbfb569c0191

[...]
django.core.exceptions.ImproperlyConfigured: Set the DJANGO_SECRET_KEY env variable
ERROR: Service 'api' failed to build: The command '/bin/sh -c python manage.py migrate' returned a non-zero code: 1

然而,最后一行,CMD python manage.py runserver 0.0.0.0:8001 --settings=falcon.settings.dev-microservice确实按照需要启动,并设置了必要的env vars。

# Dockerfile -- api

FROM python:3

RUN pip3 -q install -r requirements.txt
RUN echo `$DJANGO_SECRET_KEY`
RUN python manage.py migrate --settings=falcon.settings.dev-microservice # <-- why does this not work
CMD python manage.py runserver 0.0.0.0:8001 --settings=falcon.settings.dev-microservice

为什么Dockerfile的倒数第二行由于未设置的环境变量而失败,而最后一行按预期工作?

答案

RUN仅在构建图像时使用。 CMD是从图像启动容器时启动的命令。如果在构建映像时运行迁移是错误的,则迁移正在构建数据库,并且您希望每次在runserver之前运行它

# Dockerfile -- api

FROM python:3

RUN pip3 -q install -r requirements.txt
RUN echo `$DJANGO_SECRET_KEY`
CMD /bin/bash -c "python manage.py migrate --settings=falcon.settings.dev-microservice && python manage.py runserver 0.0.0.0:8001 --settings=falcon.settings.dev-microservice"

这是如何在docker中启动django的正确方法,因为您希望在启动服务器时运行生产中的迁移。构建图像时不在PC上...

另一答案

在构建映像时,容器中看不到Dockerfile中未声明的环境变量。它们仅在运行时传递给容器。由于RUN指令在构建时执行,因此在Dockerfile外声明的环境变量DJANGO_SECRET_KEYRUN命令不可见。

要解决此问题,您可以在Dockerfile中声明env变量并通过构建参数设置它:

FROM python:3

RUN pip3 -q install -r requirements.txt
ARG key
ENV DJANGO_SECRET_KEY=$key
RUN echo `$DJANGO_SECRET_KEY`
RUN python manage.py migrate --settings=falcon.settings.dev-microservice
CMD python manage.py runserver 0.0.0.0:8001 --settings=falcon.settings.dev-microservice

然后,你应该修改composefile:

build:
  context: /Users/ben/Projects/falcon/falcon-backend
  dockerfile: Dockerfile
  args:
    - key='secrete-key'

以上是关于在docker python中缺少环境变量:3使用docker-compose的主要内容,如果未能解决你的问题,请参考以下文章

docker学习2-快速搭建centos7-python3.6环境

python2.7 环境配置

pyinstaller打包Django项目

如何声明一个将保留在 docker 容器中的环境变量?

windows下多个python版本共存

Apache托管Flask无法看到Docker环境变量。