我在构建 Python3.6-buster 容器时收到 'apt-get upgrade' 命令失败错误

I have getting 'apt-get upgrade' command failed error while building Python3.6-buster container

昨天我在 python:3.6-buster 图像上构建 Python Flask 应用程序时没有问题。但是今天我收到了这个错误。

Calculating upgrade...
The following packages will be upgraded: libgnutls-dane0 libgnutls-openssl27 libgnutls28-dev libgnutls30 libgnutlsxx28
5 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2859 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] Abort.
ERROR: Service 'gateway' failed to build: The command '/bin/sh -c apt-get upgrade' returned a non-zero code: 1

我的 Dockerfile:

FROM python:3.6-buster
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
RUN echo $TZ > /etc/timezone
RUN apt-get update
RUN apt-get upgrade
RUN apt-get -y install gcc musl-dev libffi-dev
COPY requirements.txt requirements.txt
RUN python3 -m pip install -r requirements.txt
COPY . /application
WORKDIR /application
EXPOSE 7000

我找不到任何相关问题。我猜这是关于一个新的更新,但我实际上并不知道。对于这个问题有什么建议或解决方案吗?

我猜 apt 正在等待用户输入以确认升级。如果没有 hacky 解决方案,Docker 构建器无法处理这些交互式对话框。因此,它失败了。

最直接的解决方案是在您的命令中添加 -y 标志,就像您在安装命令中所做的那样。

FROM python:3.6-buster
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
RUN echo $TZ > /etc/timezone
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get -y install gcc musl-dev libffi-dev
COPY requirements.txt requirements.txt
RUN python3 -m pip install -r requirements.txt
COPY . /application
WORKDIR /application
EXPOSE 7000

但是...您真的需要更新现有的软件包吗?在您的情况下可能不需要。此外,我可能会建议您查看 Docker Best Practices 以编写包含 apt 命令的语句。为了使您的图像保持较小的尺寸,您应该考虑将这些命令压缩在一个 运行 语句中。另外,之后你应该删除apt缓存,以尽量减少两层之间的变化:

FROM python:3.6-buster
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
RUN echo $TZ > /etc/timezone
RUN apt-get update \
&&  apt-get -y install gcc musl-dev libffi-dev \
&&  rm -rf /var/lib/apt/lists/*
COPY requirements.txt requirements.txt
RUN python3 -m pip install -r requirements.txt
COPY . /application
WORKDIR /application
EXPOSE 7000