Ketika membangun dari Dockerfile, paket Debian / Ubuntu menginstal debconf Instalasi non-aktif tidak diizinkan

29

Saya telah mengatur lingkungan berikut ini sehingga tidak ada pertanyaan / dialog yang diminta selama instalasi apt-get:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Yang setara dengan:

export DEBIAN_FRONTEND="noninteractive"

Namun, ketika membangun gambar dari Dockerfile, di akhir satu paket Debian / Ubuntu tertentu menginstal (menggunakan apt-get install), konfigurasi paket debconf mengatakan:

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.

Wow ... saya menemukan kesalahan saya. Tidak ada cara untuk memberikan komentar di baris ENV di Dockerfile. Saya akan menjawab sendiri karena saya yakin ini akan menggigit beberapa orang lain ...

Phil L.
sumber

Jawaban:

57

Ini harus aktif berkecil untuk mengatur DEBIAN_FRONTENDuntuk noninteractivemelalui ENV. Alasannya adalah bahwa variabel lingkungan tetap ada setelah membangun, misalnya ketika Anda menjalankan docker exec -it ... bash. Pengaturan tidak masuk akal di sini.

Ada dua cara lain yang mungkin:

  1. Tetapkan via ARGini karena ini hanya tersedia selama build:

    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get -qq install {your-package}
    
  2. Atur on-the-fly saat diperlukan.

    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get -qq install {your-package}
    
k0pernikus
sumber
8
mendaftar hanya untuk memilih
André Werlang
@ AndréWerlang: Saya juga!
gvgramazio
27

Oke, sumber masalahnya adalah: Anda tidak dapat menggunakan # untuk memberi komentar pada baris ENV di Dockerfiles karena tidak ada pembatas untuk mengatakan "end of env variable", semua yang ada setelah nama variabel dan spasi segera setelahnya akan berada di variabel.

yaitu dengan garis Dockerfile:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Variabel:

DEBIAN_FRONTEND

akan berisi persis seluruh baris ini:

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

dan setara dengan melakukan:

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

Saya hampir membatalkan pertanyaan saya, tetapi dengan mesin pencari dan Stack Exchange, beberapa orang mungkin akan menemukan kesalahan mereka di sini suatu hari nanti ;-)

Phil L.
sumber
5
Jika ini adalah jawaban yang sebenarnya Anda harus menerimanya demikian sehingga pertanyaan tidak lagi terdaftar sebagai tidak dijawab.
Andy Shinn
4
Hal ini disarankan untuk menggunakan ENVuntuk DEBIAN_FRONTEND, lihat: github.com/docker/docker/issues/4032
k0pernikus