我的环境
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!
dockder-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_CONFIGdocker run -e SECRET_CONFIG=/home/stokvis/dev/app/secrets.json --name django-app-test -it django-app:latest
但似乎docker不想加载变量。
如果要在docker主机或kubernetes集群上运行,有没有更好的方法来为图像提供秘密?我错过了一些基本的东西吗?
答案 0 :(得分:0)
我决定使用kubernetes / docker秘密来提供这些解决方案。
我使用了基本设置文件,然后使用特定的文件作为系统中环境变量的一部分进行开发和生产。
作为示例,base.py中的SECRET_KEY设置如下所示
SECRET_KEY = os.environ.get('SECRET_KEY')
然后我在kubernetes部署中使用以下设置来调用settign的秘密。
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: sandbox-app-secret
key: SECRET_KEY