ฉันควรใช้การอัปเดต apt-get เมื่อใดและเพราะเหตุใด


15

คำถามทั่วไป:

บางคนสามารถอธิบายสิ่งที่คำสั่งapt-get updateทำและเมื่อฉันควรใช้มันจริงเหรอ?


หมายเหตุ

โปรดให้คำตอบรายละเอียด ไม่ใช่แค่สำเนาของ man page ยกเว้นว่าเวอร์ชั่นของคุณมีรายละเอียดมาก (ฉันใส่นิยามจาก man page ด้านล่าง)

apt-get update : ใช้เพื่อซิงโครไนซ์ไฟล์ดัชนีแพ็คเกจจากแหล่งที่มา ดัชนีของแพ็คเกจที่มีอยู่จะถูกดึงจากตำแหน่งที่ระบุใน /etc/apt/sources.list(5) ควรทำการอัปเดตเสมอก่อนที่จะอัปเกรดหรืออัพเกรด


Sub-คำถาม:

  • จัดเก็บดัชนีแพ็กเกจไว้ที่ไหน บนฐานข้อมูล ในไฟล์?
  • จะเกิดอะไรขึ้นถ้าฉันapt-get installไม่อัพเดทแคช? มีโอกาสที่แพ็กเกจระยะไกลจะไม่อยู่อีกต่อไปและลิงก์จะใช้งานไม่ได้หรือไม่
  • มีบางการเมืองที่ตกลงกันเกี่ยวกับที่เก็บ deb หรือไม่? ตัวอย่างเช่นที่เก็บควรมีเพียงเวอร์ชันสุดท้ายของแพ็คเกจหรือในทางตรงกันข้ามมันควรมีทุกเวอร์ชั่นสำหรับการเผยแพร่เฉพาะ?

บริบท

ฉันถามคำถามของฉันเพราะฉันกำลังศึกษากรอบเทียบท่า หนึ่งในคุณสมบัติของมันคือDockerfileซึ่งช่วยให้คุณสร้างอิมเมจระบบปฏิบัติการได้โดยเรียกใช้คำสั่งจากไฟล์นี้ คุณสมบัติหนึ่งของภาพนี้คือมันควรจะเหมือนกันเสมอไม่ว่าบริบทคืออะไร (เวลาของการสร้าง ฯลฯ )

ฉันกลัวว่าถ้าฉันเปิดใช้งานapt-get updateคำสั่งในเวลาที่ต่างกันผลลัพธ์จะแตกต่างกันดังนั้นรูปภาพของฉันจะแตกต่างกัน


ฉันคิดว่าโพสต์นี้สามารถใช้เป็นบทความวิกิสำหรับวิธีถามคำถามระดับสูง มีประโยชน์มาก.
Zerodf

คำตอบ:


12

apt-get update ดาวน์โหลดรายการแพ็คเกจที่มี

รายการแพ็คเกจสามารถเปลี่ยนแปลงได้ตลอดเวลา มีการเพิ่มแพ็คเกจใหม่และแพ็คเกจเก่าจะถูกลบออก ดังนั้นหากคุณมีแคชเก่าจริงๆและคุณลองทำapt-get installมันอาจพยายามดาวน์โหลดแพ็คเกจที่ไม่มีอยู่อีกต่อไป
ระยะเวลาที่แพ็กเกจเก่าถูกเก็บในที่เก็บขึ้นอยู่กับผู้ดูแล repo (การแจกจ่ายของคุณ) ดังนั้นหากคุณกำลังใช้บางสิ่งบางอย่างเช่นนักเทียบท่าซึ่งแคชอาจล้าสมัยคุณควรใช้งานapt-get updateก่อนติดตั้งแพ็กเกจใด ๆ

เหตุผลในการลบและเพิ่มแพ็กเกจส่วนใหญ่เป็นการแก้ไขข้อผิดพลาดและการปรับปรุงความปลอดภัย แม้ว่าคุณจะใช้ repos ของบุคคลที่สามอย่าง PPA ก็ตาม

เมื่อใช้บางอย่างเช่นนักเทียบท่าสำหรับการจัดเก็บในสภาพแวดล้อมแบบองค์กรคุณควรสร้างคอนเทนเนอร์หนึ่งครั้งจากนั้นย้ายคอนเทนเนอร์นั้นผ่านสภาพแวดล้อมการวางจำหน่ายต่างๆของคุณ (การพัฒนาการจัดเตรียมการผลิต) และไม่สร้างคอนเทนเนอร์ใหม่ทุกครั้ง สิ่งนี้จะทำให้แน่ใจว่าคุณจะไม่ได้รับคอนเทนเนอร์อื่นที่ไม่ได้ทำการทดสอบ

เพื่อตอบคำถามของคุณว่าไฟล์แคชอยู่ที่/var/lib/apt/listsใด


คำตอบที่ดี! ขอขอบคุณ! ฉันต้องการตอบกลับสำหรับย่อหน้า"(... ) ไม่สร้างคอนเทนเนอร์ใหม่ทุกครั้งสิ่งนี้จะทำให้แน่ใจว่าคุณไม่ได้รับคอนเทนเนอร์อื่นที่ยังไม่ได้ทดสอบ" ฉันได้อ่านว่าแนวทางปฏิบัติที่ดีที่สุดคือห้ามใช้การอัพเกรด apt-get เหตุผลข้อหนึ่งก็คือ: "นอกจากนี้ยังสร้างภาพที่ไม่สอดคล้องกันเพราะคุณไม่มีแหล่งข้อมูลแห่งความจริงอีกต่อไปว่าแอปพลิเคชันของคุณควรทำงานอย่างไรและเวอร์ชันอ้างอิงใดรวมอยู่ในภาพ" มันเป็นปัญหาเดียวกันapt-get updateหรือเปล่า? และ Dockerfile ไม่ควรรับประกันภาพใช่ไหม
Pierre-Jean

2
Kinda apt-get updateจะมีผลกับแพ็คเกจที่เพิ่งติดตั้งใหม่เท่านั้น แพ็คเกจที่มีอยู่จะได้รับการอัพเกรดหากจำเป็นต้องใช้กับแพ็คเกจใหม่ (ซึ่งควรน้อยที่สุด) เมื่อapt-get upgradeคุณอัปเกรดแพ็คเกจทั้งหมดรวมถึงแพคเกจที่มีอยู่แล้วจะทำให้ได้ภาพที่แตกต่างกันอย่างมากมาย แม้ว่าสิ่งนี้อาจส่งผลให้เกิดผลลัพธ์ที่แตกต่างกันในแต่ละครั้งที่คุณสร้างจาก dockerfile แต่โดยส่วนตัวแล้วฉันไม่คิดว่านี่เป็นปัญหาร้ายแรงหากคุณผ่านการวางจำหน่ายหลายสภาพแวดล้อม ฉันคิดว่านี่เป็นปัญหามากกว่าถ้าคุณแจกจ่ายไฟล์ dockerfile ให้กับคนอื่นและให้พวกเขาสร้างมันขึ้นมา
Patrick

0

บางคนสามารถอธิบายว่าคำสั่ง apt-get update ทำอะไรได้บ้างและเมื่อใดที่ฉันควรใช้มัน

apt-get update ดาวน์โหลดดัชนีที่อัปเดตจากที่เก็บแพ็กเกจการกระจายรายชื่อแพ็คเกจที่มีทั้งหมดและรุ่นที่แม่นยำ

การแจกแจงทั่วไปเช่นอูบุนตูและเดเบียนมักจะอนุรักษ์นิยมและเข้ากันได้ย้อนหลังในแพ็คเกจของพวกเขาดังนั้นเวอร์ชันจะไม่เปลี่ยนแปลงมากนักเมื่อเวลาผ่านไป พวกเขาจะเปลี่ยนเนื่องจากการปรับปรุงความปลอดภัยหรือแก้ไขข้อผิดพลาด ยกตัวอย่างเช่น MySQL จะได้รับการอัพเกรดจาก5.7.18ไปแต่ไม่ได้ไป5.7.196.x

จัดเก็บดัชนีแพ็กเกจไว้ที่ไหน บนฐานข้อมูล ในไฟล์?

/var/lib/aptก็มักจะถูกเก็บไว้ในหนึ่งหรือไฟล์มากขึ้นภายใน ในบริบทของนักเทียบท่าไฟล์เหล่านี้อยู่ในรูปภาพ เมื่อสร้างไฟล์ Dockerfile พวกมันจะถูกจัดเก็บในเลเยอร์ใหม่ของระบบไฟล์ที่สร้างขึ้นและคงอยู่เป็นรูปที่สร้างขึ้นใหม่

จะเกิดอะไรขึ้นถ้าฉันติดตั้ง apt-get โดยไม่ต้องอัพเดตแคช

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

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

มีโอกาสที่แพ็กเกจระยะไกลจะไม่อยู่อีกต่อไปและลิงก์จะใช้งานไม่ได้หรือไม่

แน่นอนเพราะรุ่นที่เก็บไว้ในดัชนีมีความแม่นยำมากเช่น5.7.19(การทำให้เข้าใจง่าย; มันคล้ายกับ5.7.19-0ubuntu1)

มีบางการเมืองที่ตกลงกันเกี่ยวกับที่เก็บ deb หรือไม่? ตัวอย่างเช่นที่เก็บควรมีเพียงเวอร์ชันสุดท้ายของแพ็คเกจหรือในทางตรงกันข้ามมันควรมีทุกเวอร์ชั่นสำหรับการเผยแพร่เฉพาะ?

เป็นเรื่องปกติที่รุ่นเล็กรุ่นเก่าจะถูกลบออกอย่างรวดเร็วเมื่อมีการอัพเดท ฉันคิดว่านี่คือการประหยัดพื้นที่บนเซิร์ฟเวอร์เป็นไบนารีสามารถชั่งน้ำหนักหลายสิบเมกะไบต์คูณด้วยทุกรุ่นและสถาปัตยกรรมที่รองรับ ดังนั้นจึงมักจะเป็นไปไม่ได้ที่พินกล่าวว่าmysql-5.7.18ในภายหลังapt-get install; เร็ว ๆ นี้mysql-5.7.19มีการนำออกใช้ในการแจกจ่ายรายการก่อนหน้านี้จะถูกลบออก

เพื่อความเป็นธรรมต่อนักเทียบท่าสิ่งนี้ไม่ใช่ปัจจัย apt-get updateปัญหานี้เป็นเรื่องที่นำมาซึ่งเป็นส่วนหนึ่งของการจัดการบรรจุภัณฑ์ของการแจกจ่ายแต่ละครั้ง คุณจะมีปัญหาเดียวกันกับที่พยายามสร้างเครื่องเสมือน EC2 หรือ Vagrant ซ้ำ ๆ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.