从Dockerfile进行构建时,Debian / Ubuntu软件包安装debconf不允许非交互式安装


29

我设置了以下环境,以便在apt-get安装期间不询问任何问题/对话框:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

等效于:

export DEBIAN_FRONTEND="noninteractive"

但是,当从Dockerfile构建映像时,在一个特定的Debian / Ubuntu软件包安装结束时(使用apt-get install),软件包配置debconf说:

debconf: unable to initialize frontend: Noninteractive    # export DEBIAN_FRONTEND="noninteractive"
debconf: (Bareword "Debconf::FrontEnd::Noninteractive" not allowed while "strict subs" in use at (eval 35) line 3, <> line 1.)
debconf: falling back to frontend: Noninteractive
Subroutine BEGIN redefined at (eval 36) line 2, <> line 1.

哇...我发现了我的错误。无法在Dockerfile的ENV行中添加注释。我要回答自己,因为我相信这会咬住其他人。

Answers:


57

应当积极劝阻设置DEBIAN_FRONTENDnoninteractive通过ENV。原因是环境变量在构建后仍然存在,例如在运行时docker exec -it ... bash。此处的设置没有意义。

还有其他两种可能的方法:

  1. 通过进行设置,ARG因为这仅在构建期间可用:

    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get -qq install {your-package}
    
  2. 必要时可即时设置。

    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get -qq install {your-package}
    

8
签约只投了
安德烈Werlang

@AndréWerlang:我也是!
gvgramazio

27

好的,问题的根源是:您不能使用#在Dockerfiles中的ENV行上添加注释,因为没有定界符说“ env变量的结尾”,变量名之后的所有内容以及紧随其后的空格都将位于变量。

即与Dockerfile行:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

变量:

DEBIAN_FRONTEND

将完全包含这一行:

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

等效于:

export DEBIAN_FRONTEND='noninteractive    # export DEBIAN_FRONTEND="noninteractive"'

我几乎要取消我的问题,但是有了搜索引擎和Stack Exchange,有些人可能有一天会在这里发现他们的错误;-)


5
如果这是实际答案,则应接受该答案,这样该问题就不再列为未回答。
安迪·辛

4
不推荐ENV用于DEBIAN_FRONTEND,请参阅:github.com/docker/docker/issues/4032
k0pernikus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.