【问题标题】:Do I need apt-get update and upgrade in my Python Dockerfile我的 Python Dockerfile 中是否需要 apt-get 更新和升级
【发布时间】:2020-09-15 20:08:43
【问题描述】:

我有一个非常简约的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" ]

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

如果我不需要在这个极简的 Dockerfile 中运行它们,我什么时候需要运行它们?我注意到它们通常在 installing other packages 时运行。

【问题讨论】:

    标签: python linux docker apt-get


    【解决方案1】:

    ubuntu:18.04 这样的基本 Docker Hub Linux 发行版镜像实际上会定期更新自己:如果您docker pull ubuntu:18.04,请等待一周,然后重复一遍,您将获得更新的镜像。你有点依赖中间图像,比如python:3.8,做同样的事情。

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

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

    如果您需要安装任何操作系统级别的软件包,您确实需要运行apt-get update,并且出于 Docker 层缓存的原因,您应该在与相应的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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-06
        • 2014-12-27
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多