#docker #opencv #installation
#ubuntu #установка #docker #apt-get
Вопрос:
Можно ли как-то ответить на вопросы, которые представлены в виде диалоговых окон при установке некоторых пакетов с использованием apt-get?
Например, я пытаюсь настроить контейнер, содержащий mail-stack-delivery
пакет с:
FROM ubuntu
RUN apt-get install -y mail-stack-delivery
Однако этот dockerfile генерирует десятки ошибок при сборке, которые соответствуют:
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:
Насколько я понимаю, я просто не могу отвечать на диалоги, но есть ли какой-нибудь способ передать параметр для ответа на каждый вопрос заранее? Я знаю, что это просто изменение некоторых конфигураций, поэтому я мог бы сделать это постфактум, но, по-видимому, лучше позволить сценариям установки сделать это, чтобы все было настроено правильно.
Ответ №1:
Смотрите обсуждение здесь: 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
.
Комментарии:
1. У меня был такой
RUN apt-get -y -qq install python-pip php-mbstring php-bcmath
, который останавливал сборку моего dockerfile в приглашении с сообщением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 пропустило приглашение
Ответ №2:
Вы должны установить DEBIAN_FRONTEND=неинтерактивный в качестве envvar. В большинстве случаев это, по крайней мере, позволит избежать ошибок при установке.
Также, как упоминал @Azdle, использование debconf-set-selections позволит вам устанавливать определенные элементы.
Ответ №3:
Как обычно, еще немного поисков нашли ответ.
Ответ таков debconf-set-selections
. Страница руководства: http://manpages.ubuntu.com/manpages/oneiric/en/man1/debconf-set-selections .1.html
Чтобы найти параметры, которые можно установить, используйте debconf-get-selections
в системе, в которой уже установлен пакет. Вам нужно будет установить debconf-utils
для второй команды.
Ответ №4:
Это рабочее решение:
АРГУМЕНТ DEBIAN_FRONTEND= неинтерактивный
Комментарии:
1. Не могли бы вы, пожалуйста, объяснить свой ответ? Например, почему это работает, в чем проблема и т. Д.
2. Конечно. У меня была такая же проблема. Я попытался добавить «ЗАПУСТИТЬ DEBIAN_FRONTEND= неинтерактивный apt-get install», но получил ту же ошибку. Если я добавлю «RUN DEBIAN_FRONTEND=noninteractive» ко всем командам apt-get, то все будет работать нормально. После этого я добавил «ARG DEBIAN_FRONTEND= неинтерактивный», и это работает как шарм! Извините за мой ответ, я здесь новичок. Я могу удалить его 🙂
3. Хороший ответ не только устраняет проблему, но и объясняет причины, стоящие за ней. Например, посмотрите на принятый ответ. Поэтому я предлагаю вам либо сильно отредактировать свой ответ и включить некоторую справочную информацию о том, почему эти команды работают, либо удалить его. Я знаю, что вы имели в виду хорошее, но в конечном итоге мы хотим сохранить высокий стандарт.
4. Понижающий голос. Это решение уже упоминалось в последней части принятого ответа годом ранее.
Ответ №5:
ENV DEBIAN_FRONTEND noninteractive
у меня не получилось
ни один из них не ARG DEBIAN_FRONTEND=noninteractive
но RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
сделал
Ответ №6:
ПРИМЕР с успехом:
echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
sudo apt-get install -y -q <package name>
Ответ №7:
Причина ENV DEBIAN_FRONTEND=noninteractive
, по которой (или устаревший синтаксис ENV DEBIAN_FRONTEND noninteractive
) иногда работает, а иногда не имеет отношения к использованию sudo
. По умолчанию sudo
игнорирует среду текущего пользователя и использует чистую. Этим можно управлять с помощью sudo --preserve-env
флага. Очевидно, что добавление этого к каждому sudo
вызову является громоздким, но легко сделать всю систему для каждого пользователя неинтерактивной, добавив переменную среды в /etc/environment
файл операционной системы.
RUN set -a
amp;amp; eval "$(sudo tee --append /etc/environment <<<'DEBIAN_FRONTEND=noninteractive')"
amp;amp; set a
amp;amp; sudo apt-get update
amp;amp; sudo apt-get install mail-stack-delivery
Быстрое выделение важного фрагмента в отдельности:
# export every variable that follows
set -a
# appends the given string to the `/etc/environment` file as root
# tee prints its input to standard out
# eval interprets the output of tee
eval "$(sudo tee --append /etc/environment <<<'DEBIAN_FRONTEND=noninteractive')"
# stop exporting everything
set a
Это было упомянуто ранее DEBIAN_FRONTEND=noninteractive
, что не должно быть установлено таким глобальным образом. Это зависит от того, какова цель вашего изображения. Если он предназначен для автоматизации, а не для людей, тогда вполне нормально установить его глобально.