Score:3

apt อัปเดตพฤติกรรมต่าง ๆ ใน Dockerfile และพร้อมต์ส่งคืนรหัสข้อผิดพลาด 100 แต่ใช้งานได้

ธง kr

ฉันกำลังพยายามติดตั้ง apt source บน Microsoft azure function docker นี่คือ Dockerfile ของฉัน

จากmcr.microsoft.com/azure-functions/python:3.0-python3.9

RUN echo 'deb [trusted=yes] http://deb.debian.org/debian testing main' > /etc/apt/sources.list.d/testing.list
RUN apt อัพเดต -y

สิ่งนี้ล้มเหลวใน ฉลาดปรับปรุง -y ขั้นตอนโดยมีข้อผิดพลาดดังต่อไปนี้

คำเตือน: apt ไม่มีอินเทอร์เฟซ CLI ที่เสถียร ใช้ด้วยความระมัดระวังในสคริปต์

รับ:1 http://deb.debian.org/debian buster InRelease [122 kB]
รับ:2 http://security.debian.org/debian-security buster/updates In Release [65.4 kB]
ตี: 3 http://security.debian.org/debian-security jessie/updates In Release
รับ:4 http://deb.debian.org/debian buster-updates In Release [51.9 kB]
รับ:5 https://packages.microsoft.com/debian/9/prod stretch InRelease [4009 B]
รับ:6 http://deb.debian.org/debian การทดสอบ InRelease [112 kB]
รับ:7 https://packages.microsoft.com/debian/9/prod stretch/main amd64 แพ็คเกจ [161 kB]
รับ:8 http://deb.debian.org/debian testing/main amd64 Packages [8248 kB]
การอ่านรายการแพ็คเกจ...
E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' เปลี่ยนค่า 'Suite' จาก 'stable' เป็น 'oldstable'
E: Repository 'http://deb.debian.org/debian buster InRelease' เปลี่ยนค่า 'Suite' จาก 'stable' เป็น 'oldstable'
E: Repository 'http://deb.debian.org/debian buster-updates InRelease' เปลี่ยนค่า 'Suite' จาก 'stable-updates' เป็น 'oldstable-updates'
คำสั่ง '/bin/sh -c apt update -y' ส่งคืนรหัสที่ไม่ใช่ศูนย์: 100

แต่:

  • ถ้าฉันเรียกใช้สองคำสั่งเดียวกันหลังจากเปิดตัว นักเทียบท่าเรียกใช้ --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9, ฉลาดปรับปรุง -y ทำงานได้ดี
  • ถ้าฉันเปลี่ยนภาพฐานเป็น เดเบียน:บัสเตอร์-สลิม ซึ่งอิงจากอิมเมจ การสร้างนักเทียบท่าทำงานได้ดี
  • แม้ว่าคำสั่งจะล้มเหลว ฉันสามารถติดตั้งแพ็คเกจจาก การทดสอบ, เช่น., ฉลาดปรับปรุง -y || ฉลาดติดตั้ง g++ จะติดตั้ง g++-10 แทนค่าเริ่มต้น ก++-8 บนบัสเตอร์

มีความคิดว่าเหตุใดคำสั่งจึงล้มเหลว และฉันจะแก้ไขได้อย่างไร?


แก้ไข: การเพิ่ม --allow-releaseinfo-change ถึง ฉลาดปรับปรุง -y ใน dockerfile แก้ไขปัญหา แต่ฉันยังต้องการทราบ ทำไม มันล้มเหลวโดยไม่มี?


บันทึก: คำถามย้ายจาก SO เนื่องจากเห็นได้ชัดว่าไม่ตรงประเด็น... แจ้งให้เราทราบหากไม่ตรงประเด็นที่นี่

Michael Hampton avatar
cz flag
apt repos เหล่านั้นยุ่งเหยิงไปหมด ใครเป็นผู้สร้างคอนเทนเนอร์ที่คุณใช้เป็นฐาน ฉันจะไม่แปลกใจถ้าไม่มีอะไรทำงาน
kr flag
@MichaelHampton เป็นอิมเมจอย่างเป็นทางการสำหรับฟังก์ชันแอปพลิเคชัน Python ที่เชื่อมต่อบน Azure สามารถดูไฟล์ Docker ได้ที่นี่ https://github.com/Azure/azure-functions-docker/blob/dev/host/3.0/buster/amd64/python/python39/python39.Dockerfile
Score:3
ธง br

TL;ดร

ปัญหารากคือจุดบกพร่องในอิมเมจพื้นฐานที่คุณใช้ การแก้ไขอย่างถาวรคือการล้างออก /var/lib/apt/lists ในอิมเมจฐาน Dockerfile แต่สามารถแก้ไขได้ชั่วคราวโดยสร้างอิมเมจพื้นฐานใหม่หรือใช้ไฟล์ --allow-releaseinfo-change ตัวเลือก.

สาเหตุที่พฤติกรรมนี้แตกต่างกันระหว่าง สร้างนักเทียบท่า และ เรียกใช้นักเทียบท่า - มัน คือการใช้ -t ตั้งค่าสถานะเพื่อจัดสรร tty สิ่งนี้จะเปลี่ยนพฤติกรรมของ ฉลาด -y (APT::Get::สมมติ-ใช่).

คำอธิบายแบบเต็ม

Repository ... เปลี่ยนค่า 'Suite' แล้ว

ข้อผิดพลาดนี้เกิดขึ้นเมื่อ:

  1. APT มีไฟล์รีลีสเวอร์ชันแคช -- นี่คือจุดบกพร่อง อิมเมจฐานนักเทียบท่าโดยทั่วไปควรล้างแคชนี้
  2. repo ระยะไกลมีเวอร์ชันที่ใหม่กว่า
  3. บางฟิลด์ไม่ตรงกันระหว่างสองเวอร์ชัน

ในสภาพแวดล้อมที่ไม่ใช่นักเทียบท่า การตรวจสอบนี้มีวัตถุประสงค์ เพื่อปกป้องผู้ใช้จากการติดตั้งแพ็คเกจจาก Debian รุ่นอื่นอย่างกะทันหันและโดยไม่คาดคิด

ในกรณีนี้คือรูปฐาน mcr.microsoft.com/azure-functions/python:3.0-python3.9 ประกอบด้วย ที่มีอยู่ เวอร์ชันแคชของไฟล์ Debian buster Release (เงื่อนไข #1) กับ ห้องชุด: มีเสถียรภาพเพราะเป็นปัจจุบันในขณะที่สร้าง

อย่างไรก็ตามสำเนาหลักใน ไฟล์เก็บถาวร Debian นั้นใหม่กว่า (เงื่อนไข #2) และตอนนี้มี ห้องชุด: oldstable (เงื่อนไข #3) เนื่องจาก Debian 10 บัสเตอร์ได้รับ แทนที่ โดย Debian 11 เป้า

ดังนั้นเมื่อคุณพยายามที่จะวิ่ง การปรับปรุงที่เหมาะสม ในรูปฐานนี้ มันล้มเหลวเนื่องจากการ ไม่ตรงกัน ระหว่างแคชเวอร์ชันเก่ากับเวอร์ชันปัจจุบัน

ฉันลองใช้ Dockerfile ของคุณแล้ว (2021-09-03) และมันก็ใช้ได้ดีสำหรับฉัน อาจเป็นเพราะมันถูกสร้างใหม่ตั้งแต่ที่คุณโพสต์คำถามนี้ ซึ่งจะทำให้แคชไฟล์ Release ใหม่จากไฟล์เก็บถาวร Debian แก้ไขค่าที่ไม่ตรงกัน (#2/#3 ด้านบนไม่เป็นความจริงอีกต่อไป)

อย่างไรก็ตาม คุณสามารถตรวจสอบได้ว่าข้อบกพร่องยังคงอยู่:

$ docker run --rm -it --entrypoint bash mcr.microsoft.com/azure-functions/python:3.0-python3.9               
root@722ec78233b4:/# grep Suite /var/lib/apt/lists/*Release
/var/lib/apt/lists/deb.debian.org_debian_dists_buster-updates_InRelease:Suite: oldstable-updates
/var/lib/apt/lists/deb.debian.org_debian_dists_buster_InRelease:ชุด: oldstable
/var/lib/apt/lists/packages.microsoft.com_debian_9_prod_dists_stretch_InRelease:ชุด: ยืด
/var/lib/apt/lists/security.debian.org_debian-security_dists_buster_updates_InRelease:ชุด: oldstable
/var/lib/apt/lists/security.debian.org_debian-security_dists_jessie_updates_InRelease:ชุด: oldoldstable

และข้อผิดพลาดเดียวกันจะเกิดขึ้นอีกหลังจาก Debian รุ่นถัดไป เมื่อบัสเตอร์กลายเป็น เก่าเก่ามั่นคง และเป้ากลายเป็น เก่าแก่.

ฉันพบปัญหาที่คล้ายกันกับอิมเมจฐานนักเทียบท่าที่ไม่เกี่ยวข้องเมื่อเร็วๆ นี้ และฉันคิดว่าข้อบกพร่องนี้ค่อนข้างแพร่หลาย

พฤติกรรมของ -ย ตัวเลือก

เมื่อคุณวิ่ง ฉลาด ด้วย tty เป็น stdin -ย จะลบล้างการตรวจสอบนี้และอนุญาตให้ อัปเดต คำสั่งให้สำเร็จ อย่างไรก็ตาม หากไม่มี tty (เซสชันที่ไม่โต้ตอบ) แสดงว่า -ย ตัวเลือก จะไม่ลบล้าง การตรวจสอบนี้ ฉันยืนยันสิ่งนี้โดยใช้รูปภาพบั๊กกี้เวอร์ชันเก่ากว่า:

#ยกเลิก    
นักเทียบท่าเรียกใช้ --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y

#สำเร็จ
นักเทียบท่ารัน -t --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update -y

# แจ้งให้ y/N ดำเนินการต่อ
นักเทียบท่าเรียกใช้ -it --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update

#ยกเลิก
นักเทียบท่าเรียกใช้ --rm mcr.microsoft.com/azure-functions/python:3.0.15066-python3.9-slim apt update
kr flag
ขอบคุณสำหรับคำตอบ สิ่งนี้ไม่ได้อธิบายว่าทำไมรหัสถึงทำงานได้ดีเมื่อรันโดยตรงในคอนเทนเนอร์เทียบกับใน Dockerfile มีความคิดอย่างไร
br flag
มันใช้งานได้ดีสำหรับฉันในทั้งสองกรณี (docker build และ docker run) เนื่องจากอิมเมจได้รับการอัปเดตแล้ว คุณยังสามารถสร้างสิ่งนี้ซ้ำได้หรือไม่ และถ้าทำได้ คุณสามารถโพสต์ผลลัพธ์ของ `docker image ls mcr.microsoft.com/azure-functions/python:3.0-python3.9` (เฉพาะ ID รูปภาพ) ได้หรือไม่
kr flag
ขออภัย ฉันได้อัปเดตรูปภาพด้วย ดังนั้นฉันจึงไม่สามารถทำซ้ำได้อีก... หากฉันพบรหัสรูปภาพเฉพาะที่ใช้งานไม่ได้ ฉันจะแจ้งให้คุณทราบ
br flag
ฉันพบรูปภาพเวอร์ชันเก่าและสามารถสร้างพฤติกรรมซ้ำได้ เพิ่มคำอธิบาย

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา