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

29

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

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

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

export DEBIAN_FRONTEND="noninteractive"

Тем не менее, при создании образа из Dockerfile, в конце одной конкретной установки пакета Debian / Ubuntu (с использованием установки apt-get), 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}
    
k0pernikus
источник
8
подписался только на голосование
Андре Верланг
@ АндреВерланг: Я тоже!
gvgramazio
27

Хорошо, источник проблемы заключался в следующем: вы не можете использовать # для добавления комментариев к строкам 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 некоторые люди, возможно, когда-нибудь найдут здесь свою ошибку ;-)

Фил Л.
источник
5
Если это фактический ответ, вы должны принять его как таковой, чтобы вопрос больше не значился без ответа.
Энди Шинн
4
Рекомендуется использовать ENVдля DEBIAN_FRONTEND, см .: github.com/docker/docker/issues/4032
k0pernikus