使用 docker-compose 在 docker python:3 中缺少环境变量
Missing Environment Vars in docker python:3 with 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
确实按需要启动,并设置了必要的环境变量。
# 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
的倒数第二行由于未设置环境变量而失败,而最后一行按预期工作?
环境变量未在 Dockerfile 中声明的在构建映像时对容器不可见。它们仅在运行时传递给容器。由于 RUN
指令在构建时执行,因此在 Dockerfile 外部声明的环境变量 DJANGO_SECRET_KEY
对 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
然后,您应该修改 composefile 为:
build:
context: /Users/ben/Projects/falcon/falcon-backend
dockerfile: Dockerfile
args:
- key='secrete-key'
RUN
仅在构建镜像时使用。 CMD
是从镜像启动容器时启动的命令。如果您在构建映像时 运行 迁移是错误的,迁移正在构建您的数据库并且您希望每次 运行 它在 运行 服务器
之前
# 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 上...
虽然我的配置看起来不错,但我的 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
确实按需要启动,并设置了必要的环境变量。
# 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
的倒数第二行由于未设置环境变量而失败,而最后一行按预期工作?
环境变量未在 Dockerfile 中声明的在构建映像时对容器不可见。它们仅在运行时传递给容器。由于 RUN
指令在构建时执行,因此在 Dockerfile 外部声明的环境变量 DJANGO_SECRET_KEY
对 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
然后,您应该修改 composefile 为:
build:
context: /Users/ben/Projects/falcon/falcon-backend
dockerfile: Dockerfile
args:
- key='secrete-key'
RUN
仅在构建镜像时使用。 CMD
是从镜像启动容器时启动的命令。如果您在构建映像时 运行 迁移是错误的,迁移正在构建您的数据库并且您希望每次 运行 它在 运行 服务器
# 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 上...