警告:以“root”用户身份运行 pip

V.D*_*.D. 8 python django ubuntu pip docker

我正在 docker 中制作我的 python django 应用程序的简单图像。但在建设容器的结束,它抛出下一个警告(我建立它在Ubuntu 20.04) WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead。如果我按照我的理解在我的图像中的 python 上安装需求,为什么它会抛出这个警告。我正在使用sudo docker build -t my_app:1 .. 我是否应该担心 pip 抛出的警告,因为我知道它会破坏我的系统?这是我的 dockerfile

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt

COPY . .

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Run Code Online (Sandbox Code Playgroud)

The*_*le1 111

此行为是作为“错误修复”引入pip中的。21.1

pip22.1开始,您现在可以使用参数选择退出警告:

pip install --root-user-action=ignore
Run Code Online (Sandbox Code Playgroud)

您可以使用以下环境在容器中忽略这一点:

ENV PIP_ROOT_USER_ACTION=ignore
Run Code Online (Sandbox Code Playgroud)

#11035

  • 我不知道这在容器中是否是一种“不好的做法”,容器按原样容器化到沙盒环境中。对于最低公分母@pradyunsg 的观点非常固执 (7认同)

que*_*o42 35

更新220930

这个答案的好消息是您可以忽略警告,但对于 pip version >= 来说,忽略警告不再是最佳实践22.1。在撰写此答案时,22.1我还不知道 pip version >= 的新技巧。

点版本>=22.1

请遵循Maximilian Burszley的回答。在撰写本文时我还不知道这一点,并且允许您通过一个很小的参数来避免警告。

pip 版本 >=21.1和 <22.1

您可以忽略此警告,因为您创建映像是出于隔离目的,因此它在组织上与虚拟环境一样隔离。从技术上讲不是,但这在这里并不重要。

投入时间并在映像中创建虚拟环境或添加用户(如其他答案中那样只是为了避免警告)通常不会有回报,因为您不应该对此有任何问题。它可能会在调试期间遮蔽您的视图,但不会阻止代码工作。

只要检查pip -V一下pip3 -V就知道是否需要注意不要pip在需要时误用为Python 2pipPython 3的时候错误地使用Python 2。但应该是这样,如果你只安装Python 3的pip,无论如何都不会有这个问题。

点子版本<21.1

在这些旧版本中,无论如何都不会弹出警告,请再次查看其他答案。从问题的年龄也可以清楚地看出,这个警告在旧版本中没有出现。

  • 我也这么想。不知道这个回答有没有人反对!我不打算在我的 docker 容器中拥有多个用户,该容器是我从 Python:3.9 继承的。我不明白为什么我应该努力在 Dockerfile 中创建用户!维护起来也会更加困难! (8认同)
  • 是的,你是对的;重新阅读时,我发现该警告出现在 21.1 中,而抑制该警告的标志稍后出现在 22.1 中。(但我认为值得将第三部分标题从“pip version &lt;22.1”更改为“pip version ≥21.1 and &lt;22.1”,以防有人想知道为什么在某些情况下他们没有收到警告。) (2认同)

Hey*_*Man 15

我不喜欢忽视警告,因为有一天你会监督一个重要的警告。

这是关于python 的最佳 docker 实践的很好的解释。搜索一下Example with virtualenv你会发现这个:

# temp stage
FROM python:3.9-slim as builder

WORKDIR /app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apt-get update && \
    apt-get install -y --no-install-recommends gcc

RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

COPY requirements.txt .
RUN pip install -r requirements.txt


# final stage
FROM python:3.9-slim

COPY --from=builder /opt/venv /opt/venv

WORKDIR /app

ENV PATH="/opt/venv/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

就像魅力一样起作用。没有警告或类似内容。顺便说一句,出于安全原因,他们还建议创建一个非 root 用户。

编辑:要消除所有警告,您可能还需要将以下条目添加到 Dockerfile 的构建器部分(适用于Debian 8.3.x):

ARG DEBIAN_FRONTEND=noninteractive
ARG DEBCONF_NOWARNINGS="yes"

RUN python -m pip install --upgrade pip && \
    ...
Run Code Online (Sandbox Code Playgroud)

  • @alper:这是一个 Docker 镜像。它不应该以交互方式使用,因此您只想安装必要的内容。 (4认同)

mar*_*er_ 7

容器的构建方式不会添加用户,因此一切都以 root 身份完成。

您可以通过执行以下操作来创建用户并安装到该用户的主目录;

FROM python:3.8.3-alpine

RUN pip install --upgrade pip

RUN adduser -D myuser
USER myuser
WORKDIR /home/myuser

COPY --chown=myuser:myuser requirements.txt requirements.txt
RUN pip install --user -r requirements.txt

ENV PATH="/home/myuser/.local/bin:${PATH}"

COPY --chown=myuser:myuser . .

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Run Code Online (Sandbox Code Playgroud)

  • 我得到“选项 d 不明确(调试、禁用登录、禁用密码)”,因为 Ubuntu 18.04,“adduser”没有“-D”标志 (8认同)
  • [有些人认为](/sf/ask/2789871311/) `useradd` 更便携,应该是首选:[Dockerfile 最佳实践](https:// /docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) 还建议改为“useradd”。 (7认同)
  • 在将“RUN pip install --upgrade pip”移动到“USER myuser”下方之前,我仍然会看到警告 (2认同)