Docker: มีปัญหาในการติดตั้ง apt-utils


118

ฉันพยายามติดตั้งapt-utilsบน Docker เพราะตอนที่เพิ่งทำapt-get updateฉันได้รับข้อผิดพลาด: debconf: delaying package configuration, since apt-utils is not installed. ดังนั้นฉันจึงเพิ่มบรรทัดเพื่อติดตั้งapt-utils(พร้อมกับcurl):

RUN apt-get update && apt-get install -y apt-utils && apt-get install -y curl

แต่ฉันยังคงได้รับข้อผิดพลาดนั้นทำให้ฉันเชื่อว่าคำสั่งของฉันไม่ได้ผล ด้านล่างนี้คือผลลัพธ์ของฉันเมื่อฉันพยายามสร้างภาพ

Step 5/12 : RUN apt-get update && apt-get install -y apt-utils && apt-get install -y curl
 ---> Running in 6e6565ff01bd
Get:1 http://security.debian.org jessie/updates InRelease [94.4 kB]
Ign http://deb.debian.org jessie InRelease
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]
Get:3 http://deb.debian.org jessie Release.gpg [2420 B]
Get:4 http://deb.debian.org jessie Release [148 kB]
Get:5 http://security.debian.org jessie/updates/main amd64 Packages [624 kB]
Get:6 http://deb.debian.org jessie-updates/main amd64 Packages [23.0 kB]
Get:7 http://deb.debian.org jessie/main amd64 Packages [9098 kB]
Fetched 10.1 MB in 6s (1541 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  libapt-inst1.5
The following NEW packages will be installed:
  apt-utils libapt-inst1.5
0 upgraded, 2 newly installed, 0 to remove and 24 not upgraded.
Need to get 537 kB of archives.
After this operation, 1333 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian/ jessie/main libapt-inst1.5 amd64 1.0.9.8.4 [169 kB]
Get:2 http://deb.debian.org/debian/ jessie/main apt-utils amd64 1.0.9.8.4 [368 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 537 kB in 0s (557 kB/s)
Selecting previously unselected package libapt-inst1.5:amd64.
(Reading database ... 21676 files and directories currently installed.)
Preparing to unpack .../libapt-inst1.5_1.0.9.8.4_amd64.deb ...
Unpacking libapt-inst1.5:amd64 (1.0.9.8.4) ...
Selecting previously unselected package apt-utils.
Preparing to unpack .../apt-utils_1.0.9.8.4_amd64.deb ...
Unpacking apt-utils (1.0.9.8.4) ...
Setting up libapt-inst1.5:amd64 (1.0.9.8.4) ...
Setting up apt-utils (1.0.9.8.4) ...
Processing triggers for libc-bin (2.19-18+deb8u10) ...
Reading package lists...
Building dependency tree...
Reading state information...
curl is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.
Removing intermediate container 6e6565ff01bd
 ---> f65e29c6a6b9
Step 6/12 : RUN curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
 ---> Running in f5764ba56103
Detected operating system as debian/8.
Checking for curl...
Detected curl...
Checking for gpg...
Detected gpg...
Running apt-get update... done.
Installing debian-archive-keyring which is needed for installing
apt-transport-https on many Debian systems.
Installing apt-transport-https... done.
Installing /etc/apt/sources.list.d/github_git-lfs.list...done.
Importing packagecloud gpg key... done.
Running apt-get update... done.

The repository is setup! You can now install packages.
Removing intermediate container f5764ba56103
 ---> a4e64687ab73

สาเหตุนี้เกิดจากอะไรและจะแก้ไขได้อย่างไร ขอขอบคุณ!

คำตอบ:


116

นี่ไม่ใช่ข้อผิดพลาดจริงๆและสามารถเพิกเฉยได้อย่างปลอดภัย ฉันได้สร้างอิมเมจคอนเทนเนอร์จำนวนมากโดยไม่เคยมี apt-utils ใด ๆ และไม่ว่าข้อความเตือนนี้จะเป็นอย่างไรการติดตั้งแพ็คเกจทั้งหมดจะดำเนินการและทำงานได้ตามปกติ

อย่างไรก็ตามหากคุณต้องการมี apt-utils - ติดตั้ง คำเตือนนี้จะแจ้งเตือนคุณหนึ่งครั้งจากนั้นจะหายไปสำหรับการเรียกใช้ apt-get ในอนาคต (ดังที่คุณเห็นในบันทึกของคุณเองcurlได้รับการติดตั้งโดยไม่มีข้อความนั้น)

หมายเหตุหากคุณติดตั้ง apt-utils คุณจะได้รับคำเตือนอื่น ๆ (เนื่องจากตอนนี้โปรแกรมติดตั้งสามารถเรียกใช้ config แบบโต้ตอบได้และจะพยายามและล้มเหลว) หากต้องการระงับสิ่งเหล่านั้นและมีแพ็คเกจที่มีการกำหนดค่าแบบโต้ตอบด้วยค่าเริ่มต้นให้เรียกใช้ apt-get เช่นนี้DEBIAN_FRONTEND=noninteractive apt-get install -y pkgs....


11
คุณสามารถระบุข้อมูลอ้างอิงสำหรับความคิดเห็น "ปลอดภัยที่จะเพิกเฉย" ได้หรือไม่
Zak

19
เป็นคำเตือนที่ทราบแล้วดูตัวอย่างได้ที่นี่: github.com/phusion/baseimage-docker/issues/… (สิ่งนี้เกิดขึ้นกับแพ็คเกจที่มีการกำหนดค่าแบบโต้ตอบซึ่งจะถามคำถามกับคุณนั่นหมายความว่าการกำหนดค่าแบบโต้ตอบถูกข้ามไป แต่คุณไม่ทำ ไม่จำเป็นต้องใช้และต้องการค่าเริ่มต้นอยู่ดีเพราะคุณกำลังใช้งานการติดตั้งอัตโนมัติ)
Leo K

ไม่ใช่คำเตือนที่ไม่สนใจเสมอไปทั้งนี้ขึ้นอยู่กับแพ็คเกจเฉพาะที่คุณกำลังติดตั้ง บางครั้งการกำหนดค่าเป็นสิ่งที่จำเป็นและคุณจะต้องทำการติดตั้งแบบโต้ตอบหรือหาวิธีอื่นในการกำหนดค่าที่ต้องการ
Ken Williams

47

หลังจากค้นหาทางอินเทอร์เน็ตฉันพบทางเลือกอื่นที่ควรค่าแก่การกล่าวถึงแทนที่จะใส่DEBIAN_FRONTEND=noninteractiveหน้าทุกครั้งapt-get install -y {your-pkgs}:

ทางเลือกที่ 1: ARG DEBIAN_FRONTEND = noninteractive

คำสั่ง ARG กำหนดตัวแปรที่ผู้ใช้สามารถส่งผ่านเวลาสร้างไปยังตัวสร้างด้วยคำสั่งสร้างนักเทียบท่าโดยใช้แฟล็ก --build-arg = (อ้างอิง: [ 6 ])

ลักษณะการแก้ปัญหา:

  • ARG คำสั่งถูกตั้งค่าในระหว่างการสร้างเท่านั้น
  • ตัวเลือก 'noninteractive' ถูกตั้งค่าเป็นค่าเริ่มต้นสำหรับเวลาสร้างเท่านั้น
  • เนื่องจากเป็นอาร์กิวเมนต์จึงสามารถเปลี่ยนแปลงได้โดยส่งค่าอื่นสำหรับอาร์กิวเมนต์นี้ด้วยเช่น docker build --build-arg DEBIAN_FRONTEND=newt

ตัวอย่าง:

ARG DEBIAN_FRONTEND=noninteractive
...
RUN apt-get -yq install {your-pkgs}

ทางเลือกที่ 2: On-the-fly

เป็นทางออกจากลีโอเค

ลักษณะการแก้ปัญหา:

  • สามารถตั้งค่าได้ตามที่ต้องการ ดังนั้นวิธีแก้ปัญหาที่ละเอียดดี
  • สามารถตั้งค่าเป็นค่าอื่นในคำสั่งเฉพาะได้ดังนั้นจึงไม่ได้ตั้งค่าแบบทั่วโลก
  • ขอบเขตคือRUNและจะไม่ส่งผลต่อคำสั่งอื่น ๆ

ตัวอย่าง:

RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install {your-pkgs}

ทางเลือกที่ 3: ENV DEBIAN_FRONTEND = noninteractive

การตั้งค่าENV DEBIAN_FRONTEND noninteractiveก็เป็นอีกทางเลือกหนึ่งเช่นกัน แต่ขอแนะนำอย่างยิ่ง

อีกวิธีหนึ่งคือการตั้งค่าที่ขอทานและยกเลิกการตั้งค่าที่ส่วนท้ายของ Dockerfile

ลักษณะการแก้ปัญหา:

  • ENV คำสั่งจะคงอยู่ที่ตัวแปรสภาพแวดล้อมหลังจากการสร้าง (ไม่แนะนำ) นอกจากนี้
  • อาจเกิดข้อผิดพลาดได้ง่ายหากคุณลืมตั้งค่ากลับเป็นค่าเริ่มต้น
  • เนื่องจากมีการตั้งค่าด้วยENVรูปภาพและส่วนประกอบทั้งหมดที่สร้างขึ้นจากรูปภาพจะได้รับการสืบทอดมาซึ่งจะเปลี่ยนพฤติกรรมได้อย่างมีประสิทธิภาพ (ดังที่กล่าวไว้ใน [ 1 ]) ผู้ที่ใช้รูปภาพเหล่านั้นประสบปัญหาเมื่อติดตั้งซอฟต์แวร์แบบโต้ตอบเนื่องจากโปรแกรมติดตั้งไม่แสดงกล่องโต้ตอบใด ๆ
  • ฟรอนต์เอนด์เริ่มต้นคือDEBIAN_FRONTEND=newt(ดู [ 2 ] ดังนั้นจึงต้องตั้งค่าไว้ที่ส่วนท้ายของไฟล์

ตัวอย่าง:

# Set for all apt-get install, must be at the very beginning of the Dockerfile.
ENV DEBIAN_FRONTEND noninteractive
...
# Non-interactive modes get set back.
ENV DEBIAN_FRONTEND newt

ทางเลือกที่ 4: RUN export DEBIAN_FRONTEND = noninteractive

ลักษณะการแก้ปัญหา:

  • ค่อนข้างคล้ายกับทางเลือกที่ 2
  • โดยการแยกส่วนการทำงานร่วมกันเป็นทุกข์: เหตุใดจึงมีการส่งออกตัวแปรนี้และสิ่งที่เป็นของ (apt-get)
  • ขอบเขตคือRUNและจะไม่ส่งผลต่อคำสั่งอื่น ๆ

ตัวอย่าง:

# Set the frontend and then install your package
RUN export DEBIAN_FRONTEND=noninteractive && \
    ...
    apt-get -yq install {your-pkgs} && \
    ...

อ่านเพิ่มเติม (อ้างอิง)


2
ฉันใช้ "ทางเลือกที่ 2: ขณะบิน": สะอาดและสะดวกมากฉันไม่มีคำเตือนที่น่าสับสนอีกต่อไป
herve-guerin

ฉันเลือกทางเลือกที่ 1 และยังคงได้รับคำเตือน Dockerfile ของฉันเริ่มต้นด้วยFROM node:10.16.2 WORKDIR /usr/src/app ARG DEBIAN_FRONTEND=noninteractiveและฉันเรียกใช้docker build --no-cache -t node-10-16-2-plus-chrome .
Marecky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.