使用Docker Secret将Django的SECRET_KEY添加到./manage.py collectstatic中
好久不见。
这次为了在docker容器内不公开django的SECRET_KEY而苦苦挣扎,终于找到了一种方法来添加环境变量而不必暴露它。我想分享一下这个方法。不过,关于shell部分和一些我个人觉得还不够熟练的地方,如果有最佳实践,请告诉我。
介绍部分
我认为在Docker容器中经常会使用ENV,但是我认为只有安全性方面可以公开的信息才能保存在dockerfile中。
#alpine使うことが多い
FROM alpine:3.15
ENV hogehoge=fuga
/ # env
hogehoge=fuga
#貴様みているな!
或许有人会说直接照抄有点无聊……好吧,等等就知道了。
那么我们应该怎么办呢?
最初我想到的是,类似于k8s的secret之类的东西在这里是否也有。然而,我在这里{:target=”_blank”}看到有关使用docker命令的secret的详细说明,所以我参考了它。
请准备好Dockerfile、.env和shell文件,如果可能的话,请确保Docker Engine是最新版本。
我把它放在以下目录里。
-
- /directory
.env
Dockerfile
build.sh
.env文件
DJANGO_SECRET_KEY=hogehoge
构建.sh
建造用的外殼
#!/usr/bin/env bash
cd "$(dirname $0)" || exit
image_name=test/test-django
image_tag=1.0
container_name=test-django
# ここでenvファイルを一時的な環境変数にしている。source .envで動きそうだが、試したらダメだった。
export $(cat .env || grep -v ^# | xargs)
# --secretというのが今回の重要なポイント
docker build . --progress=plain --secret id=django_env,env=DJANGO_SECRET_KEY --ssh default -t ${image_name}:${image_tag} -f directory/Dockerfile
docker tag ${image_name}:${image_tag} ${image_name}:latest
Dockerfile 的释义
FROM alpine:3.15
# 省略 django入れて
# このRUNの間DJANGO_SECRET_KEYは使える
RUN --mount=type=secret,id=django_env export DJANGO_SECRET_KEY=$(cat /run/secrets/django_env) \
&& python3 ./manage.py collectstatic --noinput --settings=test-django.settings
大概能用这段代码做到吧。(因为有些代码已经省略了,所以希望你能搞定!)
通过Dockerfile和docker命令,在id=django_env的地方成为关键,并且在run目录的secrets文件夹中似乎临时创建了一个名为django_env的临时文件。
(暂时在容器内进行了确认。)
除了Dockerfile,您可能还注意到了build.sh等文件也被导出传递了。
有没有更加优雅的写法?
请放心。
我也非常认同。
就我个人而言,我想就设定 DJANGO_SECRET_KEY 这一项就好了。
经过几次尝试,虽然不完全达到我所想的样子,但我现在已经完成了(在我内心中的)最终形式。
结束
在过去的一年里,我一直参与与ISMS(信息安全管理体系)和PMS(私人数据管理系统)相关的安全工作,通过在职培训,我深感这么多泄漏风险和预防泄漏的技术存在,对于目前的职位我非常感激。
我时常在想,即使在创业公司,也可以构建与ISMS相似的系统,不是吗?