如何在docker容器

时间:2018-01-31 19:26:55

标签: python django dockerfile

我的环境

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_CONFIG
docker run -e SECRET_CONFIG=/home/stokvis/dev/app/secrets.json --name django-app-test -it django-app:latest

但似乎docker不想加载变量。

如果要在docker主机或kubernetes集群上运行,有没有更好的方法来为图像提供秘密?

我错过了一些基本的东西吗?

1 个答案:

答案 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