Lors de la construction à partir de Dockerfile, Debian / Ubuntu package install debconf Installation non interactive non autorisée

29

J'ai défini l'environnement suivant afin qu'aucune question / boîte de dialogue ne soit posée pendant l'installation d'apt-get:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Ce qui équivaut à:

export DEBIAN_FRONTEND="noninteractive"

Pourtant, lors de la construction d'une image à partir d'un Dockerfile, à la fin d'une installation de paquet Debian / Ubuntu spécifique (en utilisant l'installation apt-get), la configuration du paquet debconf dit:

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 ... J'ai trouvé mon erreur. Il n'y a aucun moyen de mettre un commentaire dans les lignes ENV dans Dockerfile. Je vais me répondre car je suis sûr que cela mordra d'autres personnes ...

Phil L.
la source

Réponses:

57

Il devrait être activement découragée de mettre l' DEBIAN_FRONTENDà noninteractivepar ENV. La raison en est que la variable d'environnement persiste après la génération, par exemple lorsque vous exécutez docker exec -it ... bash. Le réglage n'aurait pas de sens ici.

Il existe deux autres manières possibles:

  1. Réglez-le via ARGcar cela n'est disponible que pendant la construction:

    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get -qq install {your-package}
    
  2. Réglez-le à la volée si nécessaire.

    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get -qq install {your-package}
    
k0pernikus
la source
8
inscrit uniquement pour voter
André Werlang
@ AndréWerlang: Moi aussi!
gvgramazio
27

Ok, la source du problème était: vous ne pouvez pas utiliser # pour mettre des commentaires sur les lignes ENV dans Dockerfiles car il n'y a pas de délimiteur pour dire "fin de la variable env", tout ce qui se trouve après le nom de la variable et l'espace immédiatement après va être dans le variable.

c'est-à-dire avec la ligne Dockerfile:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

La variable:

DEBIAN_FRONTEND

contiendra exactement toute cette ligne:

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

et équivaut à faire:

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

J'étais sur le point d'annuler ma question, mais avec les moteurs de recherche et Stack Exchange, certaines personnes trouveront probablement leur erreur ici un jour ;-)

Phil L.
la source
5
S'il s'agit de la réponse réelle, vous devez l'accepter en tant que telle afin que la question ne soit plus répertoriée comme sans réponse.
Andy Shinn
4
Il est déconseillé d'utiliser ENVpour DEBIAN_FRONTEND, voir: github.com/docker/docker/issues/4032
k0pernikus