Чи можна відповісти на діалогові запитання при встановленні під docker?


77

Чи можна якимось чином відповісти на запитання, які представлені у вигляді діалогових вікон під час встановлення деяких пакунків за допомогою apt-get?

Наприклад, я намагаюся встановити контейнер, що містить mail-stack-deliveryпакет, з:

FROM ubuntu

RUN apt-get install -y mail-stack-delivery

Однак цей файл docker генерує десятки помилок при побудові, які відповідають:

debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7, <> line 11.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin: 

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

Відповіді:


78

Див. Обговорення тут: https://github.com/docker/docker/issues/4032 . Коротше кажучи, налаштування ENV DEBIAN_FRONTEND noninteractiveне рекомендується, оскільки воно зберігається на кінцевому зображенні, навіть коли працює щось подібне docker run -i -t ... bash. Тому рекомендується або опустити DEBIAN_FRONTENDпопередження, або жити з ним, або вказати його явно для кожної команди, наприклад RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q package.

До щастя, нові ARGдирективи встановлює змінні , які живуть тільки в процесі складання , так більш елегантне рішення стало можливим , що це зазначено в DockerFileще не зберігаються в остаточному зображенні: ARG DEBIAN_FRONTEND=noninteractive.


У мене було таке, RUN apt-get -y -qq install python-pip php-mbstring php-bcmathщо зупиняло створення мого докер-файлу підказкою із повідомленням A new version (/usr/lib/php/7.0/php.ini-production.cli) of configuration file /etc/php/7.0/cli/php.ini is available, but the version installed currently has been locally modified.... What do you want to do about modified configuration file php.ini... 1. install the new version, 2. keep the local version.... Додавання цього env var опустило підказку
shadi

26

Ви повинні встановити DEBIAN_FRONTEND = неінтерактивний як envvar. У більшості випадків це принаймні робить це, щоб установка не помилилася.

Також, як згадував @Azdle, використання debconf-set-selections дозволить вам встановити конкретні елементи.


14

Як завжди, трохи більше пошуків знайшли відповідь.

Відповідь така debconf-set-selections. Ручна сторінка: http://manpages.ubuntu.com/manpages/oneiric/en/man1/debconf-set-selections.1.html

Щоб знайти параметри, які можна встановити, використовуйте debconf-get-selectionsв системі, де вже встановлений пакет. Вам потрібно буде встановити debconf-utilsдля другої команди.


7

Це робоче рішення:

ARG DEBIAN_FRONTEND = неінтерактивний


4
Не могли б ви пояснити свою відповідь?
Наприклад,

1
Звичайно. У мене була та сама проблема. Я намагався додати "RUN DEBIAN_FRONTEND = неінтерактивний apt-get install", але отримав ту ж помилку. Якщо я додаю "RUN DEBIAN_FRONTEND = неінтерактивний" до всіх команд apt-get, то це справно працює. Після цього я додав "ARG DEBIAN_FRONTEND = неінтерактивний", і це працює як шарм! Вибачте за мою відповідь, я тут новачок. Я можу його видалити :)
vovandos

1
Хороша відповідь не просто усуває проблему, а й пояснює аргументацію. Наприклад, подивіться на прийняту відповідь. Тому я пропоную вам або сильно відредагувати свою відповідь та включити довідкову інформацію про те, чому ці команди працюють, або видалити її. Я знаю, що ви мали на увазі добро, але в кінцевому рахунку ми хочемо дотримуватися високих стандартів.
Леандр Мозінгер,

4

ENV DEBIAN_FRONTEND noninteractive не працював у мене

ні зробив ARG DEBIAN_FRONTEND=noninteractive

але RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selectionsзробив


3

ПРИКЛАД З УСПІХОМ:

echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
sudo apt-get install -y -q <package name>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.