ฉันจะสร้างสภาวะแวดล้อม Linux ที่ระบุแพ็คเกจเฉพาะได้อย่างไร


9

ฉันกำลังสร้าง dockerfile ที่รันแอ็พพลิเคชันแบบกำหนดเองที่เชื่อมโยงกับ Java เวอร์ชันที่เจาะจง

ฉันใช้อิมเมจพื้นฐาน centos7 เพราะนั่นคือสิ่งที่บทความที่ฉันอ้างถึงใช้และเพราะฉันต้องใช้บางสิ่งบางอย่างดังนั้นมันก็ดีเหมือนกัน ฉันไม่สนใจสิ่งที่ผู้ใช้กำลังใช้งานอยู่ จุดสำคัญของภาพนี้คือซอฟต์แวร์ที่โฮสต์อยู่การกระจายตัวของ Linux เป็นเพียงวิธีการสิ้นสุด - ที่สำคัญ JDK จะไม่ถูกใช้โดยแอปพลิเคชันหรือผู้ใช้อื่น

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

บทความที่ฉันตามมาเริ่มต้นด้วยส่วนที่เกี่ยวข้องกับการติดตั้ง JDK ติดตั้งที่มีลักษณะเช่นนี้:

FROM centos:centos7
RUN yum makecache \
    && yum update -y \
    && yum install -y \
    java-1.8.0-openjdk-devel \
    && yum clean all

นั่นไม่เจาะจงพอทุกครั้งที่มีการสร้างอิมเมจมันจะได้รับ Java เวอร์ชันสุ่มซึ่งไม่ใช่สิ่งที่ฉันต้องการฉันต้องการ Java เวอร์ชันที่เจาะจง

ฉันเปลี่ยนไฟล์นักเทียบท่าเป็นแบบนี้:

FROM centos:centos7
RUN yum makecache \
    && yum update -y \
    && yum install -y \
    java-1.8.0-openjdk-devel-1.8.0.65-3.b17.el7 \
    && yum clean all

และภาพนักเทียบท่าก็สร้างได้ดี นั่นคือในเดือนธันวาคม

ในสัปดาห์นี้ฉันต้องทำการเปลี่ยนแปลงเล็กน้อยกับส่วนอื่นของซอฟต์แวร์และสร้างรูปภาพเวอร์ชันใหม่ แต่การสร้างรูปภาพล้มเหลวในขณะนี้

การสร้างล้มเหลวในขณะนี้เนื่องจากแพ็คเกจ Java รุ่นที่ระบุไม่สามารถใช้งานได้อีกต่อไป (อย่างน้อยฉันคิดว่านั่นคือสิ่งที่บอกฉัน):

Error: Package: 1:java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 (base)
Requires: java-1.8.0-openjdk-headless = 1:1.8.0.65-3.b17.el7
Available: 1:java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64 (base)
java-1.8.0-openjdk-headless = 1:1.8.0.65-3.b17.el7
Installing: 1:java-1.8.0-openjdk-headless-1.8.0.71-2.b15.el7_2.x86_64 (updates)
java-1.8.0-openjdk-headless = 1:1.8.0.71-2.b15.el7_2

ฉันจะสร้าง dockerfile ของฉันใหม่เพื่อให้ฉันสามารถใช้ Java เวอร์ชันที่ระบุได้เสมอ (ในตัวอย่างนี้ฉันต้องการให้เวอร์ชันของ Java เป็น 1.8.0 update 65)

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

คนอื่นทำเช่นนี้ได้อย่างไร มีวิธีอื่นในการติดตั้ง JDK เพื่อให้ฉันสามารถมีรุ่นล่าสุดของการกระจายระบบปฏิบัติการด้วยการปรับปรุงล่าสุด (ตามที่กำหนดโดยอิมเมจพื้นฐานในส่วนคำสั่ง FROM และการปรับปรุง yum) แต่ติดตั้ง JDK รุ่นที่ระบุหรือไม่

มีรุ่น Linux ที่เหมาะกับความต้องการประเภทนี้มากกว่าหรือไม่ (ฉันไม่ได้เป็น CentOS, การกระจาย Linux ของ userland นั้นไม่สำคัญสำหรับฉัน)


จะyum-versionlockโดยสามารถใช้งานได้กับหาง?
Aaron Copley

1
@AaronCopley ฉันไม่คิดอย่างนั้น versionlock ดูเหมือนจะเน้นไปที่การทำให้แน่ใจว่าเวอร์ชันนั้นอยู่ในตำแหน่งที่เป็นครั้งต่อไปที่คุณเรียกใช้การอัปเดต - แต่ฉันกังวลเกี่ยวกับการทำให้คำสั่งติดตั้งเริ่มต้นไม่ล้มเหลวเมื่อที่เก็บได้ย้ายไปยังรุ่นใหม่ ฉันไม่ได้วางแผนที่จะใช้ yum update บนสภาพแวดล้อมเฉพาะนั้นอีกครั้ง เมื่อสภาพแวดล้อมต้องการการอัพเดทใหม่อิมเมจ docker ใหม่จะถูกสร้างขึ้น (และฉันต้องการให้อิมเมจนั้นใช้ JDK รุ่นเดียวกันกับที่ใช้อยู่ตอนนี้)
Shorn

1
ขอโทษฉันคิดว่าฉันเข้าใจผิด คุณสามารถดูรุ่นที่คุณขออยู่ในฐานและติดตั้งจากการอัปเดตไม่ว่าด้วยเหตุผลใด ลองyum install -y $package --disablerepo=updates
Aaron Copley

1
@AaronCopley Yep ที่ดูเหมือนว่าจะทำงาน - ขอบคุณ! หากคุณทำให้คำตอบฉันจะทำเครื่องหมายว่าประสบความสำเร็จ หรือฉันจะเพิ่มมันเองในภายหลัง
Shorn

คำตอบ:


2

ดูเหมือนว่าจะเห็นแพ็กเกจที่คุณต้องการ แต่ด้วยเหตุผลใดก็ตามที่ติดตั้งจากที่เก็บการอัพเดต

คุณสามารถปิดการใช้งานที่เก็บการปรับปรุงในคำสั่ง yum ของคุณ;

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