【发布时间】:2018-01-31 19:26:54
【问题描述】:
我的环境
docker 17.12-ce
python 3.6.3
django 1.10.8
我有一个想要容器化的 django 应用程序。
为了保持最佳实践,我已按照建议将 settings.py 文件拆分为一个基本文件,然后每个阶段一个文件
所以我加载秘密设置的 base.py 文件看起来像这样
# Settings imported from a json file
with open(os.environ.get('SECRET_CONFIG')) as f:
configs = json.loads(f.read())
def get_secret(setting, configs=configs):
try:
val = configs[setting]
if val == 'True':
val = True
elif val == 'False':
val = False
return val
except KeyError:
error_msg = "ImproperlyConfigured: Set {0} environment variable".format(setting)
raise ImproperlyConfigured(error_msg)
它从 SECRET_CONFIG 环境变量中获取文件路径。
这在没有 docker 的情况下在本地运行应用程序时效果很好。
我创建了一个使用 python3 onbuild 映像的 dockerfile。
我的 Dockerfile 看起来像这样
# Dockerfile
# FROM directive instructing base image to build upon
FROM python:3.6.4-onbuild
MAINTAINER Lance Haig
RUN mkdir media static logs
VOLUME ["$WORKDIR/logs/"]
# COPY startup script into known file location in container
COPY docker-entrypoint.sh /docker-entrypoint.sh
# EXPOSE port 8000 to allow communication to/from server
EXPOSE 8000
# CMD specifcies the command to execute to start the server running.
CMD ["/docker-entrypoint.sh"]
# done!
docker-entrypoint.sh 文件如下所示
#!/bin/bash
python manage.py migrate # Apply database migrations
python manage.py collectstatic --noinput # Collect static files
# Prepare log files and start outputting logs to stdout
touch /usr/src/app/logs/gunicorn.log
touch /usr/src/app/logs/access.log
tail -n 0 -f /usr/src/app/logs/*.log &
export DJANGO_SETTINGS_MODULE=django-app.settings.development
# Start Gunicorn processes
echo Starting Gunicorn.
# exec gunicorn django-app.wsgi:application --bind 0.0.0.0:8000 --workers 3
exec gunicorn django-app.wsgi:application \
--name sandbox_django \
--bind 0.0.0.0:8000 \
--workers 3 \
--log-level=info \
--log-file=/usr/src/app/logs/gunicorn.log \
--access-logfile=/usr/src/app/logs/access.log \
"$@"
我尝试在使用此命令启动容器时设置环境变量 SECRET_CONFIG
docker run -e SECRET_CONFIG=/home/stokvis/dev/app/secrets.json --name django-app-test -it django-app:latest
但似乎 docker 不想加载变量。
如果要在 docker 主机或 kubernetes 集群上运行图像,是否有更好的方法来为图像提供秘密?
我错过了一些基本的东西吗?
【问题讨论】:
-
我可能有一个错误,但是,你如何将你的项目文件复制到 docker 容器中?您确定 docker 容器中的项目路径与本地环境(/home/stokvis/dev/app/)中的项目路径相同吗?您可能需要像使用 logs 文件夹一样将您的 secrets.json 文件挂载到 Dockerfile 中的 docker 项目。
-
你是对的,我可以将秘密文件挂载到容器中,挑战是我试图将任何需要保密的东西保存在容器之外。我会继续调查这个
标签: python django dockerfile