Під час побудови з Dockerfile пакет Debian / Ubuntu встановлює debconf Неінтерактивну установку заборонено


29

Я встановив таке середовище, щоб під час встановлення apt-get не задавали жодного питання / діалогового вікна:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Що еквівалентно:

export DEBIAN_FRONTEND="noninteractive"

Однак, будуючи зображення з Dockerfile, наприкінці однієї конкретної установки пакета Debian / Ubuntu (використовуючи apt-get install), конфігурація пакету debconf говорить:

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.

Нічого ... я виявив свою помилку. Немає можливості коментувати рядки ENV у Dockerfile. Я буду відповідати собі, бо впевнений, що це вкусить деяких інших людей ...

Відповіді:


57

Слід активно відмовляють , щоб встановити DEBIAN_FRONTENDв noninteractiveчерез ENV. Причина полягає в тому, що змінна середовища зберігається після збірки, наприклад, при запуску docker exec -it ... bash. Тут не було б сенсу.

Можливі два способи:

  1. Встановіть це через, ARGоскільки це доступно лише під час збирання:

    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get -qq install {your-package}
    
  2. Встановіть його на ходу, коли потрібно.

    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get -qq install {your-package}
    

8
підписався лише для голосування
Андре Верланг

@ AndréWerlang: Я теж!
gvgramazio

27

Гаразд, джерело проблеми полягав у тому, що ви не можете використовувати # для коментарів до ENV-рядків у Dockerfiles, тому що немає роздільника, щоб сказати "end env змінної", все, що є після назви змінної, і пробіл одразу після буде знаходитись у змінна.

тобто з рядком Dockerfile:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Змінна:

DEBIAN_FRONTEND

міститиме саме цей весь рядок:

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

і рівнозначно виконанню:

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

Я майже скасовував своє запитання, але із пошуковими системами та обміном стеками деякі люди, ймовірно, знайдуть тут свою помилку якогось дня ;-)


5
Якщо це фактична відповідь, слід прийняти її як таку, щоб питання більше не було зазначене як без відповіді.
Енді Шінн

4
Це не рекомендується використовувати ENVдля DEBIAN_FRONTEND, см: github.com/docker/docker/issues/4032
k0pernikus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.