我的 Python Dockerfile 中是否需要 apt-get update 和 upgrade

Do I need apt-get update and upgrade in my Python Dockerfile

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

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" ]

我需要运行apt-get update && apt-get -y upgrade吗?据我了解,这两个命令(1)下载最新的可用包列表和(2)升级已安装的包。为什么官方 python docker 图片还没有这样做?

如果我不需要在这个极简主义 Dockerfile 中 运行 它们,我什么时候需要 运行 它们?我注意到当 installing other packages.

时它们通常是 运行

查看 docker best pratices,您应该进行更新而不是升级,因为这需要您的容器具有特权权限才能 运行。进行更新确保您安装的是要安装的软件包的最新版本。考虑到这一点,基础镜像的提供者负责选择基础内部使用的包的版本(或更新到最新),而你负责你需要的。

基础 Docker 集线器 Linux 像 ubuntu:18.04 这样的分发映像实际上相当定期地更新自己:如果你 docker pull ubuntu:18.04,等一个星期,然后重复它,你会获得更新的图像。你有点依赖中间图像,比如 python:3.8,做同样的事情。

unheard-of 运行 apt-get update 和 Docker 文件中类似的“升级一切”命令不常见;更常见的做法是假设基本映像已经 up-to-date,或者具有特定的出处要求并在基本分发映像之上从头开始构建所有内容。

如果您使用的是 major-version 或 minor-version 图片标签(python:3python:3.8python:3.8-buster),您可能没问题,所以只要您确保定期将基本映像更新为 Docker Hub image page 中列出的内容。如果您强制使用特定的补丁级别 (python:3.8.4),您将面临一定的风险,因为一旦更新的上游版本发布,这些图像就会停止更新。

如果您需要安装任何 OS-level 软件包,您确实需要 运行 apt-get update,出于 Docker layer-caching 的原因,您应该在与相应的 apt-get install

相同的 RUN 命令
# 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