使用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相似的系统,不是吗?

广告
将在 10 秒后关闭
bannerAds