虽然我的配置看起来很好,但我的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。
# 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的倒数第二行会因为一个未设置的环境变量而失败,而最后一行将按预期工作呢?
发布于 2018-03-01 08:11:06
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的正确方法,因为您希望在启动服务器时在生产中运行迁移。不是在你的电脑上建立图像的时候.
发布于 2018-02-27 19:52:41
在构建映像时,没有在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然后,您应该按如下方式修改复合文件:
build:
context: /Users/ben/Projects/falcon/falcon-backend
dockerfile: Dockerfile
args:
- key='secrete-key'https://stackoverflow.com/questions/49015773
复制相似问题