Podczas budowania z pliku Docker, instalacja pakietu Debian / Ubuntu debconf Nieinteraktywna instalacja jest niedozwolona

29

Ustawiłem następujące środowisko, aby żadne pytanie / okno dialogowe nie było zadawane podczas instalacji apt-get:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Co odpowiada:

export DEBIAN_FRONTEND="noninteractive"

Jednak podczas budowania obrazu z pliku Docker na końcu jednej konkretnej instalacji pakietu Debian / Ubuntu (przy użyciu instalacji apt-get) debconf konfiguracji pakietu mówi:

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 ... Znalazłem swój błąd. Nie ma możliwości umieszczenia komentarza w wierszach ENV w Dockerfile. Odpowiem sobie, bo jestem pewien, że ugryzie to innych ludzi ...

Phil L.
źródło

Odpowiedzi:

57

Należy aktywnie zniechęca ustawić DEBIAN_FRONTENDaby noninteractivepoprzez ENV. Powodem jest to, że zmienna środowiskowa utrzymuje się po kompilacji, np. Po uruchomieniu docker exec -it ... bash. Ustawienie nie miałoby tutaj sensu.

Istnieją dwa inne możliwe sposoby:

  1. Ustaw za pomocą, ARGponieważ jest to dostępne tylko podczas kompilacji:

    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get -qq install {your-package}
    
  2. W razie potrzeby ustaw go w locie.

    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get -qq install {your-package}
    
k0pernikus
źródło
8
zapisał się tylko po to, aby zagłosować
André Werlang,
@ AndréWerlang: Ja też!
gvgramazio
27

Ok, źródłem problemu był: nie można użyć #, aby wstawić komentarze do linii ENV w Dockerfiles, ponieważ nie ma ogranicznika, który mógłby powiedzieć „koniec zmiennej env”, wszystko, co jest po nazwie zmiennej i spacja bezpośrednio po niej, będzie w zmienna.

tj. z linią Dockerfile:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Zmienna:

DEBIAN_FRONTEND

będzie zawierać dokładnie całą linię:

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

i jest równoważne z robieniem:

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

Prawie anulowałem moje pytanie, ale dzięki wyszukiwarkom i Stack Exchange niektóre osoby prawdopodobnie kiedyś znajdą tu swój błąd ;-)

Phil L.
źródło
5
Jeśli jest to rzeczywista odpowiedź, należy ją przyjąć jako taką, aby pytanie nie było już wyświetlane jako bez odpowiedzi.
Andy Shinn,
4
To zniechęca do korzystania ENVna DEBIAN_FRONTENDstronie: github.com/docker/docker/issues/4032
k0pernikus