75 votes

Lors de la construction à partir d'un fichier Docker, le paquet Debian/Ubuntu installe debconf Installation non interactive non autorisée

J'ai configuré l'environnement suivant pour qu'aucune question/dialogue ne soit posée pendant l'installation d'apt-get :

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Ce qui est équivalent à :

export DEBIAN_FRONTEND="noninteractive"

Pourtant, lors de la construction d'une image à partir d'un Dockerfile, à la fin de l'installation d'un paquet Debian/Ubuntu spécifique (en utilisant apt-get install), 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 le Dockerfile. Je vais répondre moi-même car je suis sûr que cela va mordre d'autres personnes...

161voto

Flying Trashcan Points 604

Il devrait être activement déconseillé pour définir le DEBIAN_FRONTEND a noninteractive vía ENV . La raison en est que la variable d'environnement persiste après la construction, par exemple lorsque vous exécutez la commande suivante docker exec -it ... bash . Le cadre n'aurait pas de sens ici.

Il existe deux autres possibilités :

  1. Réglez-le via ARG car elle 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}

34voto

Phil L. Points 965

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

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

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

La variable :

DEBIAN_FRONTEND

contiendra exactement cette ligne entière :

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

et est équivalent à faire :

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

J'ai failli annuler ma question, mais avec les moteurs de recherche et Stack Exchange, certains trouveront probablement leur erreur ici un jour ou l'autre ;-)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X