我正在 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"]
容器的构建方式不会添加用户,因此一切都以 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"]
这里答案的好消息是您可以忽略警告,但忽略警告对于pip版本>=22.1
来说不再是最佳实践。在撰写此答案时,我还不知道 pip 版本 >=
22.1
的新技巧。pip版本>=22.1
的答案。在撰写本文时我还不知道这一点,并且允许您使用一个很小的参数来避免警告。 pip 版本 >=
21.1
22.1
<您可以忽略此警告,因为您创建映像是出于隔离目的,因此它在组织上与虚拟环境一样隔离。从技术上讲不是,但这并不重要。为了避免警告而投入时间并在映像中创建虚拟环境或添加用户(如其他答案中所示)通常不会有回报,因为您不应该对此有任何问题。它可能会在调试期间遮蔽您的视图,但不会阻止代码工作。
只要检查
pip -V
和
pip3 -V
就知道你是否需要注意,当你想要 pip
用于 Python 3 时,不要错误地将 pip
用于 Python 2。但应该是这样,如果你只安装 pip对于 python 3,无论如何你都不会有这个问题。点子版本21.1
很好地解释了 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 && \
...
pip install --upgrade pip
pip install --root-user-action=ignore requests
pip3 install --upgrade pip
pip3 install --root-user-action=ignore requests