我很可能只需要一个正确方向的提示。
我有一个使用 gunicorn 和 nginx 运行 Django 应用程序的 docker 容器。此 Django 应用程序当前正在从 .env 文件获取其环境变量。
FROM python:alpine
EXPOSE 8000
RUN apk update
RUN apk add --no-cache git gcc musl-dev libffi-dev libxml2-dev libxslt-dev gcc swig g++
RUN apk add --no-cache jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff- dev tk-dev tcl-dev
RUN apk add --no-cache bash ffmpeg libmagic
RUN python3 -m pip install --upgrade pip
RUN python3 -m pip install --upgrade setuptools
RUN mkdir /opt/app
WORKDIR /opt/app
COPY . .
RUN python3 -m pip install /root/d12f/
RUN pip3 install -r requirements.txt
RUN pip3 install gunicorn
CMD sh -c 'gunicorn --conf python:app.gunicorn_conf app.wsgi --bind 0.0.0.0:8000 --reload --log-level info --access-logfile - --timeout 360 --error-logfile -'
当然,repo 中没有 .env 文件,因为这会造成安全风险。
Docker 镜像由 GitHub 创建并存储在私有 GitHub Package 中。稍后将使用此 docker 镜像在 Kubernetes 上运行。
我正在尝试找到将 .env 文件放入的最佳解决方案
/opt/app/app/.env
作为本地文件。
如果可能的话,我宁愿不使用全局环境变量。
谢谢您的任何建议。
答案1
稍后该docker镜像将用于在Kubernetes上运行。
将您的.env
文件存储为Secret
kubectl
[1]:
kubectl create secret generic app-env --from-file=.env=/path/to/your/.env
然后您可以在您的定义中将其Secret
作为卷挂载Pod
[2],[3]:
---
apiVersion: v1
kind: Pod
...
spec:
containers:
...
- name: app
image: your-image:tag
volumeMounts:
- name: app-env-vol # mount volume name
mountPath: /opt/app/app # to /opt/app/app
readOnly: true # as read-only
...
volumes:
...
- name: app-env-vol # create app-env volume
secret:
secretName: app-env # with secret name.
...
您的应用程序应该能够访问它env
的/opt/app/app/.env
。
答案2
使用wget
或云提供商 cli 命令在运行时将其拉下。
您必须使用某种身份验证机制来保护“配置文件存储”中的文件,例如 IAM 和安全存储桶。或者您的配置存储也应该接受文件。
mv
将文件放入适当的 opt 目录。