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

我已经设置了以下环境,以便在apt-get install期间不会询问问题/对话框:

ENV DEBIAN_FRONTEND noninteractive # export DEBIAN_FRONTEND="noninteractive" 

这相当于:

 export DEBIAN_FRONTEND="noninteractive" 

然而,当从一个Dockerfile构build一个镜像时,在一个特定的Debian / Ubuntu软件包安装(使用apt-get install)结束时,软件包configurationdebconf说:

 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行没有注释。 我会回答自己,因为我确信这会咬一些其他人。

好的,问题的根源在于:你不能用#在Dockerfiles的ENV行上放置注释,因为没有分隔符来表示“envvariables结束”,紧跟在variables名后面的所有内容都将在variables。

即与Dockerfile行:

 ENV DEBIAN_FRONTEND noninteractive # export DEBIAN_FRONTEND="noninteractive" 

variables:

 DEBIAN_FRONTEND 

将包含这整个行:

 noninteractive # export DEBIAN_FRONTEND="noninteractive" 

相当于做:

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

我几乎取消了我的问题,但与search引擎和堆栈交换,有些人可能会在这里发现他们的错误有一天;-)

积极劝阻通过ENVDEBIAN_FRONTEND设置DEBIAN_FRONTEND noninteractive 。 原因是环境variables在构build之后仍然存在,例如,当您运行docker exec -it ... bash 。 这里的设置没有意义。

还有两种可能的方法:

  1. 通过ARG设置它,因为这只在构build过程中可用:

     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}