Khi xây dựng từ Dockerfile, gói Debian / Ubuntu cài đặt gỡ lỗi Không được phép cài đặt không tương tác


29

Tôi đã thiết lập môi trường sau để không có câu hỏi / hộp thoại nào được hỏi trong quá trình cài đặt apt-get:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Điều này tương đương với:

export DEBIAN_FRONTEND="noninteractive"

Tuy nhiên, khi xây dựng hình ảnh từ Dockerfile, ở cuối một cài đặt gói Debian / Ubuntu cụ thể (sử dụng cài đặt apt-get), gói cấu hình gói thông báo cho biết:

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 ... tôi đã tìm thấy lỗi của mình. Không có cách nào để đưa bình luận trong các dòng ENV vào Dockerfile. Tôi sẽ tự trả lời vì tôi chắc chắn điều này sẽ cắn một số người khác ...

Câu trả lời:


57

Nên tích cực khuyến khích để thiết lập DEBIAN_FRONTENDđể noninteractivethông qua ENV. Lý do là biến môi trường vẫn tồn tại sau khi xây dựng, ví dụ như khi bạn chạy docker exec -it ... bash. Các thiết lập sẽ không có ý nghĩa ở đây.

Có hai cách khác có thể:

  1. Đặt nó qua ARGvì điều này chỉ khả dụng trong quá trình xây dựng:

    ARG DEBIAN_FRONTEND=noninteractive
    RUN apt-get -qq install {your-package}
    
  2. Đặt nó khi đang bay khi cần thiết.

    RUN apt-get update && \
        DEBIAN_FRONTEND=noninteractive apt-get -qq install {your-package}
    

8
chỉ đăng ký để bỏ phiếu
André Werlang

@ AndréWerlang: Tôi cũng vậy!
gvgramazio

27

Ok, nguồn gốc của vấn đề là: bạn không thể sử dụng # để đặt nhận xét về các dòng ENV trong Dockerfiles vì ​​không có dấu phân cách để nói "kết thúc biến env", mọi thứ nằm sau tên biến và khoảng trắng ngay sau đó sẽ nằm trong biến.

tức là với dòng Dockerfile:

ENV DEBIAN_FRONTEND noninteractive    # export DEBIAN_FRONTEND="noninteractive"

Biến:

DEBIAN_FRONTEND

sẽ chứa chính xác toàn bộ dòng này:

noninteractive    # export DEBIAN_FRONTEND="noninteractive"

và tương đương với việc làm:

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

Tôi gần như đã hủy bỏ câu hỏi của mình, nhưng với các công cụ tìm kiếm và Stack Exchange, một số người có thể sẽ tìm thấy lỗi của họ ở đây một ngày nào đó ;-)


5
Nếu đây là câu trả lời thực tế, bạn nên chấp nhận nó để câu hỏi không còn được liệt kê là chưa được trả lời.
Andy Shinn

4
Không khuyến khích sử dụng ENVcho DEBIAN_FRONTEND, xem: github.com/docker/docker/issues/4032
k0pernikus 17/8/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.