Docker: 在安装 apt-utils 时遇到问题

我正试图在 Docker 上安装 apt-utils,因为当我在做 apt-get update时,我得到了一个错误: debconf: delaying package configuration, since apt-utils is not installed。因此,我添加了一行来安装 apt-utils(以及 curl) :

RUN apt-get update && apt-get install -y apt-utils && apt-get install -y curl

但是,我仍然得到这个错误导致我相信我的命令没有工作。下面是我尝试构建图像时的输出。

Step 5/12 : RUN apt-get update && apt-get install -y apt-utils && apt-get install -y curl
---> Running in 6e6565ff01bd
Get:1 http://security.debian.org jessie/updates InRelease [94.4 kB]
Ign http://deb.debian.org jessie InRelease
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]
Get:3 http://deb.debian.org jessie Release.gpg [2420 B]
Get:4 http://deb.debian.org jessie Release [148 kB]
Get:5 http://security.debian.org jessie/updates/main amd64 Packages [624 kB]
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [23.0 kB]
Get:7 http://deb.debian.org jessie/main amd64 Packages [9098 kB]
Fetched 10.1 MB in 6s (1541 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
libapt-inst1.5
The following NEW packages will be installed:
apt-utils libapt-inst1.5
0 upgraded, 2 newly installed, 0 to remove and 24 not upgraded.
Need to get 537 kB of archives.
After this operation, 1333 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian/ jessie/main libapt-inst1.5 amd64 1.0.9.8.4 [169 kB]
Get:2 http://deb.debian.org/debian/ jessie/main apt-utils amd64 1.0.9.8.4 [368 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 537 kB in 0s (557 kB/s)
Selecting previously unselected package libapt-inst1.5:amd64.
(Reading database ... 21676 files and directories currently installed.)
Preparing to unpack .../libapt-inst1.5_1.0.9.8.4_amd64.deb ...
Unpacking libapt-inst1.5:amd64 (1.0.9.8.4) ...
Selecting previously unselected package apt-utils.
Preparing to unpack .../apt-utils_1.0.9.8.4_amd64.deb ...
Unpacking apt-utils (1.0.9.8.4) ...
Setting up libapt-inst1.5:amd64 (1.0.9.8.4) ...
Setting up apt-utils (1.0.9.8.4) ...
Processing triggers for libc-bin (2.19-18+deb8u10) ...
Reading package lists...
Building dependency tree...
Reading state information...
curl is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.
Removing intermediate container 6e6565ff01bd
---> f65e29c6a6b9
Step 6/12 : RUN curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
---> Running in f5764ba56103
Detected operating system as debian/8.
Checking for curl...
Detected curl...
Checking for gpg...
Detected gpg...
Running apt-get update... done.
Installing debian-archive-keyring which is needed for installing
apt-transport-https on many Debian systems.
Installing apt-transport-https... done.
Installing /etc/apt/sources.list.d/github_git-lfs.list...done.
Importing packagecloud gpg key... done.
Running apt-get update... done.


The repository is setup! You can now install packages.
Removing intermediate container f5764ba56103
---> a4e64687ab73

是什么导致了这种情况,我该如何解决呢?

181074 次浏览

这实际上不是一个错误,可以安全地忽略它。我已经构建了大量的容器映像,但从未在其中任何一个上使用 apt-utils,而且不管这个警告消息如何,所有的包安装都会正常进行并工作。

无论如何,如果你想使用 apt-utils-安装它。它将向您发出这个警告 一次,然后它将在以后调用 apt-get 时消失(正如您在自己的日志中看到的,curl在没有安装该消息的情况下安装)。

请注意,如果您安装 apt-utils,您将收到其他警告(因为现在安装程序 可以运行交互式配置,并将尝试该配置,但失败)。若要禁止这些命令,并让包具有交互式配置及其默认值,请运行 apt-get,如 DEBIAN_FRONTEND=noninteractive apt-get install -y pkgs....所示

在互联网上搜索之后,我找到了一些值得一提的替代品,而不是每次都把 DEBIAN_FRONTEND=noninteractive放在 apt-get install -y {your-pkgs}前面:

选项1: ARG DEBian _ FRONTEND = non 交互式

重点 : 根据反馈,选项2和选项3对你们大多数人有用,而选项1没有。这就是为什么这个替代方案是交叉的,但是为了可跟踪性和完整性而保留。

ARG 指令定义了一个用户可以传递的变量 构建器的构建时间,并使用 docker build 命令使用 —— build-arg = Flag (参考文献: [ 6])

解决方案特点:

  • ARG指令仅在生成期间设置
  • “非交互”选项仅设置为构建时的默认值。
  • 因为它是一个参数,所以可以通过为这个参数传递另一个值来更改它,例如 docker build --build-arg DEBIAN_FRONTEND=newt

例如:

ARG DEBIAN_FRONTEND=noninteractive
...
RUN apt-get -yq install {your-pkgs}

选择2: 在飞行中

这是狮子座 K 的解决方案。

解决方案特点:

  • 它可以设置在需要的地方,因此是一个很好的细粒度解决方案。
  • 可以在特定命令中将其设置为不同的值,因此它不是全局设置的。
  • 范围是 RUN,不会影响其他指令。

例如:

RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install {your-pkgs}

选项3: ENV DEBian _ FRONTEND = non 交互式

设置 ENV DEBIAN_FRONTEND noninteractive也是一种选择,但是非常不鼓励。

另一种方法是在开头设置,在 Dockerfile 末尾取消设置。

解决方案特点:

  • 此外,ENV指令会在构建后保留环境变量(不推荐)
  • 如果您忘记将它设置回默认值,那么它很容易出错。
  • 因为它是用 ENV设置的,所以它将被所有图像继承,并且包含从图像构建的内容,有效地改变它们的行为。(如[ 1]所述)使用这些映像的人在交互式安装软件时会遇到问题,因为安装程序不显示任何对话框。
  • 默认的前端是 DEBIAN_FRONTEND=newt(参见[ 2]) ,因此必须在文件末尾设置它。

例如:

# Set for all apt-get install, must be at the very beginning of the Dockerfile.
ENV DEBIAN_FRONTEND noninteractive
...
# Non-interactive modes get set back.
ENV DEBIAN_FRONTEND newt

选项4: 运行 export DEBian _ FRONTEND = non 交互式

解决方案特点:

  • 选择2非常相似
  • 通过解耦,内聚力受到了影响: 为什么会有这个变量的导出以及它属于什么(apt-get)。
  • 范围是 RUN,不会影响其他指令。

例如:

# Set the frontend and then install your package
RUN export DEBIAN_FRONTEND=noninteractive && \
...
apt-get -yq install {your-pkgs} && \
...

更多阅读(参考文献)

这是一个持续存在的问题,没有很好的解决方案... ... 我采用了这种方法,它是次优的,但它很有效:

ARG DEBIAN_FRONTEND=noninteractive


RUN apt-get update && apt-get install -y apt-utils 2>&1 | \
grep -v "^debconf: delaying package configuration, since apt-utils.*"

说明:

  • grep -v反向匹配,线开始,将消失!
  • 如果在运行时不需要,ARG 是新的 ENV。
  • 然后,我们可以使用 apt-get 一整天,在从头开始构建映像时不会显示错误。

证明这种方法有效的证据: Https://asciinema.org/a/wjcdeycxciy6ef7exw0mank3c

请运行 apt-get install apt-utils,瞧,已安装,没有警告。