在新 docker 用户中使用 python 包进行处理



我正在尝试了解如何在 docker 中使用非 root 用户处理 python 包。

让我解释一下我如何处理用户权限:运行 docker 容器时,我使用 -e USER_ID=$UID 运行它,在入口点上我使用该用户 ID 创建一个新用户,因此在运行容器时,它将以与原始用户相同的权限运行。我在以下位置阅读了它: https://denibertovic.com/posts/handling-permissions-with-docker-volumes/

关于python包:我知道pip的最佳实践是用户--user,所以包将安装在".local"上。 问题是我在 Dockerfile 本身上运行 pip install,这意味着在我更改用户之前(我仍在 root 上(。 所以 Python 包安装在根用户的".local"上。 在入口点上更改为新用户时,我无法再访问".local"和丢失我所有已安装的 Python 包

我考虑过授予新用户对/root/.local 目录的权限,但我不确定这是最好的解决方案

如何切换到与原始用户具有相同 UID 的新用户,并使用我已安装的 python 包?

以 root 身份运行pip install,没有--user选项,也没有活动的虚拟环境。

您希望以非 root 用户身份运行容器的一件事是,在不太可能发生的安全问题中,妥协无法修改您的应用程序代码。 因此,代码应由与应用程序的运行时用户不同的用户拥有。 在 Docker 上下文中,最简单的方法是以 root 身份安装应用程序,然后以非 root 身份运行。

一个近乎通用的 Dockerfile 可能看起来像

# Basic setup
FROM python:3.7
WORKDIR /app
# (We are root by default.)
# Install dependencies (globally, within the image).
COPY requirements.txt .
RUN pip3 install requirements.txt
# Copy the application in.
COPY . .
# Set up our runtime user.
RUN useradd -r app
USER app
# Specify the default command to run.
CMD ["/app/myapp"]

Docker作为开发环境非常不方便。 我建议为您的日常工作设置一个普通的 Python 虚拟环境(您的本地系统甚至可能已经安装了 Python(,并将 Docker 主要作为一种部署机制。 尝试将应用程序代码挂载到容器中会给你一个奇怪的混合环境,一方面"本地"开发需要root访问权限和一个相当复杂的环境,另一方面,你的容器环境实际上并不是你从Dockerfile构建并在生产中运行的环境。

最新更新