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

Ben*_*Ben 3 python django docker django-migrations 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
Run Code Online (Sandbox Code Playgroud)

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

# 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
Run Code Online (Sandbox Code Playgroud)

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

yam*_*enk 5

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

要解决此问题,您可以在 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
Run Code Online (Sandbox Code Playgroud)

然后,您应该像这样修改 composefile:

build:
  context: /Users/ben/Projects/falcon/falcon-backend
  dockerfile: Dockerfile
  args:
    - key='secrete-key'
Run Code Online (Sandbox Code Playgroud)