web-dev-qa-db-fra.com

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

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 ...

34
Phil L.

Il devrait être activement déconseillé pour définir le DEBIAN_FRONTEND à noninteractive via 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 ARG car 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}
    
70
k0pernikus

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 ;-)

27
Phil L.