我应该将Django应用程序docker化为非root用户吗?

4
我应该将Django应用程序作为root用户容器化吗?如果是,我如何为Django设置非root用户?因为在node.js中,应用程序应该有USER:node,这是一种更好的做法。
官方docker页面的代码示例不包括非root用户:
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
1个回答

5

这是一个通用的好做法。

在Dockerfile开始之前,在任何COPY操作之前,创建用户。它不需要具有特定属性,也不需要与任何特定的主机用户ID匹配。这样做的唯一原因是为了避免在重建时重复执行此操作。

在Dockerfile的末尾,在运行所有构建步骤后,才将USER切换到新用户。代码和任何安装的库将由根用户拥有;这很好,因为它意味着应用程序不能意外地覆盖应用程序代码。

FROM python:3

# Create the non-root user.  Doing this before any COPY means it won't
# be repeated on rebuild, for marginal savings in space and rebuild time.
# The user can have any name and any uid; it does not need to match any
# particular host system where the image might run.
RUN adduser --system --no-create-home someuser

# Install the application as in the question (still as root).
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

# Explain how to run the container.  Only switch to the non-root user now.
EXPOSE 8000
USER someuser
CMD ["./main.py"]

不要试图在容器内编写文件;相反,使用单独的数据库容器进行持久化。不要将主机用户ID作为构建参数传递。不要为用户配置密码或尝试设置交互式登录。不要创建家目录;它不会被使用。


你能澄清一下,“不要在容器内编写文件”是什么意思吗?那日志呢,以及可能上传到此应用程序中的文件呢?这并不是数据库(如SQL)应该处理的内容吧? - Hafnernuss
1
日志应该输出到标准输出。如果您能安排一个单独的服务来存储上传的文件,那就更好了;理想情况是您可以运行任意数量的应用程序副本而无需挂载任何内容。 - David Maze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接