Назад | Перейти на главную страницу

При сборке из файла Dockerfile установка пакета Debian / Ubuntu debconf Неинтерактивная установка запрещена

Я установил следующую среду, чтобы во время установки apt-get не задавались вопросы / диалоги:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Что эквивалентно:

export DEBIAN_FRONTEND="noninteractive"

Тем не менее, при создании образа из файла Docker в конце одной конкретной установки пакета 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. Я отвечу сам, так как уверен, что это укусит других ...

Так должно быть активно обескураженный установить 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}
    

Хорошо, источником проблемы было: вы не можете использовать # для добавления комментариев к строкам ENV в Dockerfiles, потому что нет разделителя, чтобы сказать «конец переменной 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"'

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