Al compilar desde Dockerfile, la instalación del paquete Debian / Ubuntu debconf La instalación no interactiva no está permitida

29

He configurado el siguiente entorno para que no se haga ninguna pregunta / diálogo durante la instalación de apt-get:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Lo que es equivalente a:

export DEBIAN_FRONTEND="noninteractive"

Sin embargo, al construir una imagen desde un Dockerfile, al final de una instalación específica del paquete Debian / Ubuntu (usando apt-get install), la configuración del paquete debconf dice:

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.

Wow ... encontré mi error. No hay forma de poner comentarios en líneas ENV en Dockerfile. Voy a responderme a mí mismo ya que estoy seguro de que esto morderá a otras personas ...

Phil L.
fuente

Respuestas:

57

Hay que desalienta activamente para establecer el DEBIAN_FRONTENDa noninteractivetravés ENV. La razón es que la variable de entorno persiste después de la compilación, por ejemplo, cuando se ejecuta docker exec -it ... bash. La configuración no tendría sentido aquí.

Hay otras dos formas posibles:

  1. Configúrelo ya ARGque solo está disponible durante la construcción:

    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get -qq install {your-package}
    
  2. Configúrelo sobre la marcha cuando sea necesario.

    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get -qq install {your-package}
    
k0pernikus
fuente
8
se inscribió solo para votar
André Werlang
@ AndréWerlang: ¡Yo también!
gvgramazio
27

Ok, la fuente del problema fue: no se puede usar # para poner comentarios en las líneas ENV en Dockerfiles porque no hay un delimitador para decir "fin de la variable env", todo lo que está después del nombre de la variable y el espacio inmediatamente después estará en el variable.

es decir, con la línea Dockerfile:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

La variable:

DEBIAN_FRONTEND

contendrá exactamente esta línea completa:

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

y es equivalente a hacer:

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

Casi estaba cancelando mi pregunta, pero con los motores de búsqueda y Stack Exchange, algunas personas probablemente encontrarán su error aquí algún día ;-)

Phil L.
fuente
55
Si esta es la respuesta real, debe aceptarla como tal para que la pregunta ya no aparezca como sin respuesta.
Andy Shinn el
44
Se desaconseja utilizar ENVpara DEBIAN_FRONTENDver: github.com/docker/docker/issues/4032
k0pernikus