【问题标题】:Docker: Having issues installing apt-utilsDocker:安装 apt-utils 时遇到问题
【发布时间】:2018-12-04 00:28:19
【问题描述】:

我正在尝试在 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

这是什么原因造成的,我该如何解决?谢谢!

【问题讨论】:

    标签: docker apt


    【解决方案1】:

    这实际上不是一个错误,忽略它是安全的。我已经构建了大量容器映像,但没有在其中任何一个上安装过 apt-utils,并且无论此警告消息如何,所有软件包安装都会正常运行。

    无论如何,如果你想拥有 apt-utils - 安装它。它会给你这个警告一次,然后它会在以后调用 apt-get 时消失(正如你在自己的日志中看到的那样,curl 安装时没有该消息)。

    注意,如果您安装了 apt-utils,您会收到其他警告(因为现在安装程序 可以 运行交互式配置,但会尝试这样做并失败)。要抑制这些并具有具有默认交互配置的软件包,请像这样运行 apt-get DEBIAN_FRONTEND=noninteractive apt-get install -y pkgs....

    【讨论】:

    • 你能为“忽略它是安全的”评论提供参考吗?
    • 这是一个已知警告,请参见此处的示例:github.com/phusion/baseimage-docker/issues/…(这种情况发生在具有交互式配置的软件包中,它会询问您问题 - 这意味着跳过了交互式配置,但您不会甚至需要它并且无论如何都想要默认值,因为您正在运行自动安装)。
    • 这并不总是一个可忽略的警告,它取决于您正在安装的特定软件包。有时配置是必要的,您必须进行交互式安装或找到其他方式为其提供所需的配置。
    【解决方案2】:

    在网上搜索后,我发现了一些值得一提的替代方案,而不是每次都将DEBIAN_FRONTEND=noninteractive放在apt-get install -y {your-pkgs}前面:

    备选方案 1:ARG DEBIAN_FRONTEND=noninteractive

    ARG 指令定义了一个用户可以传递的变量 使用 docker build 命令为构建器构建时间 --build-arg = 标志。 (参考:[6])

    解决方案特点:

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

    例子:

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

    备选方案 2:即时

    这是 Leo K 的解决方案。

    解决方案特点:

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

    例子:

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

    备选方案 3:ENV DEBIAN_FRONTEND=noninteractive

    设置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:运行导出 DEBIAN_FRONTEND=noninteractive

    解决方案特点:

    • 非常类似于替代方案2
    • 通过解耦,内聚力受损:为什么要导出此变量及其所属对象 (apt-get)。
    • 范围是RUN,不会影响其他指令。

    例子:

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

    更多阅读(参考)

    【讨论】:

    • 我使用了“Alternative 2: On-the-fly”:非常干净和方便,我再也没有令人困惑的警告了
    • 我选择了备选方案 1,但仍然收到警告。我的 Dockerfile 以 FROM node:10.16.2 WORKDIR /usr/src/app ARG DEBIAN_FRONTEND=noninteractive 开头,我运行 docker build --no-cache -t node-10-16-2-plus-chrome .
    • 注意,备选方案 1 不起作用!因为只有在使用美元符号引用构建参数时,才会在 Dockerfile 中解释构建参数。 build args 与环境变量不同,args 不会传播到运行层(与 env vars 不同)。
    【解决方案3】:

    这是一个持续存在的问题,没有很好的解决方案...我同意了,它不是最理想的,但它有效:

    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

    【讨论】:

    • 这不是修复或“最佳选择”。您只是在视觉上过滤掉错误,从而使您的 Dockerfile 杂乱无章,只是为了美观。
    • 最好的选择,我并不是要暗示好。我已将其替换为“次优”以进行澄清。这将确认并消除警告。它很实用,因为您可以返回真实状态并提高严重错误的可访问性。
    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 2013-12-24
    • 2020-02-27
    • 2018-02-25
    • 2011-06-06
    • 2021-04-14
    • 2016-03-23
    • 2018-09-25
    相关资源
    最近更新 更多