我的 Python Dockerfile 中是否需要 apt-get 更新和升级

Joh*_*etz 16 python linux apt-get docker

Dockerfile我的 Django 生产应用程序非常简约:

FROM python:3.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apt-get update &&
  apt-get -y upgrade

WORKDIR /app

COPY requirements.txt ./
RUN pip install --upgrade pip && \
  pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD [ "gunicorn", "api.wsgi:application", "--bind=0.0.0.0" ]
Run Code Online (Sandbox Code Playgroud)

我需要跑步吗apt-get update && apt-get -y upgrade?根据我的理解,这两个命令(1)下载可用软件包的最新列表和(2)升级已安装的软件包。为什么官方的 python docker 镜像还没有这样做呢?

如果我不需要在这个极简 Dockerfile 中运行它们,那么什么时候需要运行它们?我注意到它们通常在安装其他软件包时运行。

Dav*_*aze 15

基本的 Docker Hub Linux 发行版镜像ubuntu:18.04实际上会定期更新自己:如果您docker pull ubuntu:18.04等待一周并重复它,您将获得更新的镜像。你在某种程度上依赖于中间图像,比如python:3.8,做同样的事情。

apt-get update在 Dockerfile 中运行类似的“升级所有内容”命令是不寻常的,但并非闻所未闻;更常见的是假设基本映像已经是最新的,或者具有特定的出处要求并在基本分发映像之上从头开始构建所有内容。

如果您使用的是主要版本或次要版本映像标签(python:3python:3.8python:3.8-buster),那么只要您确保定期将基础映像更新为Docker Hub 映像页面上列出的内容,就可能没问题。如果您强制使用特定的补丁级别 ( python:3.8.4),您将面临一些风险,因为一旦发布较新的上游版本,这些映像就会停止获取更新。

如果您需要安装任何操作系统级别的软件包,则确实需要运行apt-get update,并且出于 Docker 层缓存的原因,您应该使用与RUN相应的命令相同的命令来执行此操作apt-get install

# Doesn't usually have an "upgrade"
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      a-package \
      another-package \
      more-packages
Run Code Online (Sandbox Code Playgroud)