【问题标题】:WARNING: Running pip as the 'root' user警告:以“root”用户身份运行 pip
【发布时间】:2021-10-10 20:30:35
【问题描述】:

我正在 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"]

【问题讨论】:

  • npm 和其他人也会给你错误/警告。最好不要以 root 身份运行,即使在容器中也是如此。您可以创建一个用户,作为 Dockerfile 的一部分,并使用它来安装/构建/运行。
  • 你明白“root用户”是什么意思吗?您了解导致进程以 root 身份运行的原因吗?当您使用sudo docker build -t my_app:1 . 时,您认为sudo 部分是什么意思?
  • @KarlKnechtel 如果我理解正确的话,Dockerfile 中的RUN pip ... 命令默认由容器的root 用户运行,而不管docker build ... 调用的是哪个主机系统用户。这就是为什么接受的答案会在 Dockerfile 中添加一个新用户。 @justin 说创建一个新的 docker 用户在任何情况下都是最佳实践,这很有趣,也许并不广为人知。
  • 我的问题是针对 OP,而不是 Justin。
  • "您了解导致进程以 root 身份运行的原因吗?"问题实际上是导致 Pip 以“root”用户身份运行的原因。这不是须藤。这实际上是 docker 默认行为。如果您希望RUN 命令不以 root 身份运行,您必须在 Dockerfile 中添加一个用户。

标签: python django docker ubuntu pip


【解决方案1】:

您的容器的构建方式不会添加用户,因此一切都以 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 pip install --upgrade pip 移动到USER myuser 下方之前,我仍然会看到警告
  • 我得到 Option d is ambiguous (debug, disabled-login, disabled-password) 因为 Ubuntu 18.04,adduser 没有 -D 标志
  • Some argue 认为useradd 更便携,应该是首选:Dockerfile best practices 也建议改为useradd
  • 当我关注这个时,pip 警告说“以 'root' 用户身份运行 pip 可能会导致权限损坏”。看来python docker官方推荐和pip官方推荐有冲突。如何处理这个
【解决方案2】:

您可以忽略此警告,因为您创建映像的目的是为了隔离,因此它在组织上与虚拟环境一样隔离。从技术上讲,这无关紧要。

通常不应该花时间在图像中创建虚拟环境或像其他答案一样添加用户,只是为了避免警告,因为你不应该对此有任何问题。

只需检查pip -Vpip3 -V 以了解您是否需要注意不要将pip 用于Python 2,而您需要pip 用于Python 3。但应该就是这样,如果您安装仅适用于 python 3 的 pip,无论如何您都不会遇到这个问题。

【讨论】:

  • 我也是这么想的。想知道有没有人反对这个答案!我不打算在我的 docker 容器中拥有多个用户,我继承自 Python:3.9 顺便说一句。我不明白为什么我应该努力在我的 Dockerfile 中创建用户!这也会使其更难维护!
【解决方案3】:

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

Here 很好地解释了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"

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

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

ARG DEBIAN_FRONTEND=noninteractive
ARG DEBCONF_NOWARNINGS="yes"

RUN python -m pip install --upgrade pip && \
    ...

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2018-05-09
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 2018-07-02
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多