Ao compilar a partir do Dockerfile, o pacote Debian / Ubuntu instala a instalação não interativa debconf não permitida

29

Eu configurei o seguinte ambiente para que nenhuma pergunta / diálogo seja feita durante a instalação do apt-get:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

O que equivale a:

export DEBIAN_FRONTEND="noninteractive"

No entanto, ao criar uma imagem a partir de um Dockerfile, no final de uma instalação específica do pacote Debian / Ubuntu (usando o apt-get install), a configuração do pacote debconf diz:

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.

Uau ... Encontrei o meu erro. Não há como colocar comentários nas linhas ENV no Dockerfile. Vou responder a mim mesmo, pois tenho certeza de que isso morderá outras pessoas ...

Phil L.
fonte

Respostas:

57

Ele deve ser desencorajado ativamente para definir o DEBIAN_FRONTENDque noninteractivevia ENV. O motivo é que a variável de ambiente persiste após a construção, por exemplo, quando você executa docker exec -it ... bash. A configuração não faria sentido aqui.

Existem duas outras maneiras possíveis:

  1. Defina-o ARGcomo apenas disponível durante a compilação:

    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get -qq install {your-package}
    
  2. Defina on-the-fly quando necessário.

    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get -qq install {your-package}
    
k0pernikus
fonte
8
inscreveu apenas para votar-se
André Werlang
@ AndréWerlang: Eu também!
gvgramazio
27

Ok, a fonte do problema foi: você não pode usar # para colocar comentários nas linhas ENV nos Dockerfiles, porque não há delimitador para dizer "variável de fim de env", tudo o que estiver após o nome da variável e o espaço imediatamente a seguir estará no variável.

ou seja, com a linha Dockerfile:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

A variável:

DEBIAN_FRONTEND

conterá exatamente toda essa linha:

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

e é equivalente a fazer:

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

Eu estava quase cancelando minha pergunta, mas com os mecanismos de pesquisa e o Stack Exchange, algumas pessoas provavelmente encontrarão seu erro aqui algum dia ;-)

Phil L.
fonte
5
Se esta é a resposta real, você deve aceitá-la como tal, para que a pergunta não seja mais listada como sem resposta.
Andy Shinn
4
Ele é desencorajado de usar ENVpara DEBIAN_FRONTEND, veja: github.com/docker/docker/issues/4032
k0pernikus