应用程序依赖于采购secrets.sh来获取环境变量。如何在我的Dockerfile中完成此操作?

时间:2019-03-29 00:25:59

标签: docker dockerfile sh

我正在创建一个容器来保存正在运行的Django应用。在开发和手动部署期间,我一直在通过在我的仓库中采购secrets.sh文件来设置环境变量。直到现在为止,我一直在尝试在Dockerfile中自动化服务器的配置环境。

到目前为止,它看起来像这样:

FROM python:3.7-alpine

RUN pip install --upgrade pip
RUN pip install pipenv

RUN addgroup -S appgroup && adduser -S appuser -G appgroup

USER appuser

WORKDIR /home/appuser/site

COPY . /home/appuser/site

RUN /bin/sh -c "source secrets.sh"
RUN env

我希望它可以正确设置环境变量,但事实并非如此。我还尝试将变量添加到我的appuser的bashrc中,但这也不起作用。

我在这里错过了什么吗?是否有另一种最佳实践来设置django可以访问env变量,而不必在我的仓库中将它们检入Dockerfile中?

1 个答案:

答案 0 :(得分:3)

每个RUN步骤都会启动带有全新外壳的全新容器;之后仅保留其文件系统。尝试启动进程或设置环境变量的RUN命令为无操作。 (RUN exportRUN service start绝对不做任何事情。)

在设置中,您需要根据在构建时不可用的信息在容器启动时设置环境变量。 (您不想在图像中保留秘密:以后获得图像的任何人都可以轻松读取它们。)通常的方法是使用入口点脚本;否则,可能会发生错误。看起来像

#!/bin/sh
# If the secrets file exists, read it in.
if [ -f /secrets.sh ]; then
  # (Prefer POSIX "." to bash-specific "source".)
  . /secrets.sh
fi
# Now run the main container CMD, replacing this script.
exec "$@"

围绕此构建的典型Dockerfile看起来像:

FROM python:3.7-alpine
RUN pip install --upgrade pip
WORKDIR /app

# Install Python dependencies, as an early step to support
# Docker layer caching.
COPY requirements.txt ./
RUN pip install -r requirements.txt

# Install the main application.
COPY . ./

# Create a non-root user.  It doesn't own the source files,
# and so can't modify the application.
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# Startup-time metadata.
ENTRYPOINT ["/app/entrypoint.sh"]
CMD ["/app/app.py"]

然后当您运行容器时,将注入秘密文件

docker run -p 8080:8080 -v $PWD/secrets-prod.sh:/secrets.sh myimage

(作为样式问题,我为该模式和单个二进制ENTRYPOINT容器保留了FROM scratch,对于容器的主要处理过程总是使用CMD。)< / p>