จะติดตั้งแพ็คเกจเฉพาะในอัลไพน์ได้อย่างไร


90

ฉันต้องDockerfileสร้างอิมเมจ Docker ที่ใช้อัลไพน์ Linux Dockerfileตอนนี้ผมต้องติดตั้งแพคเกจที่เป็นส่วนหนึ่งของเรื่องนี้

ปัจจุบันฉันมี:

RUN apk update && \
    apk upgrade && \
    apk add git

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

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?

ฉันเดาว่าฉันต้องบอกupdated, upgradeและaddรุ่นที่จะใช้ แต่ฉันจะทำเช่นนี้?

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

กล่าวอีกนัยหนึ่ง: หากgitสามารถติดตั้งผ่านnpmฉันจะสามารถเรียกใช้:

npm install git@1.9.2

(หรือรุ่นที่ฉันต้องการ) อะไรคือสิ่งที่เทียบเท่ากับ Alpine Linux?

คำตอบ:


79

คุณสามารถตั้งค่า "เหนียว" รุ่นดังนี้:

# Both are equal
apk add packagename=1.2.3-suffix
apk add 'packagename<1.2.3-suffix'

ที่จะอัพเกรดแพ็คเกจเท่านั้นจนกว่าจะมีรุ่นที่ระบุ คุณสามารถใช้ ...

apk upgrade

เพื่ออัปเกรดแพคเกจทั้งหมดในขณะที่แพ็คเกจที่ใช้เวอร์ชั่นจะยังคงเป็นเวอร์ชั่นเดิม หากต้องการตั้งค่าเวอร์ชันขั้นต่ำให้ใช้ ...

apk add "packagename>1.2.3-suffix"

ในกรณีที่คุณไม่พบแพ็คเกจในขณะที่คุณสามารถดูได้ใน UI สำหรับแพ็คเกจอัลไพน์ให้อัปเดตฐานข้อมูลต้นทาง / แพ็คเกจของคุณ:

apk update

ที่เก็บแพ็กเกจสามารถพบได้ที่นี่ :

https://pkgs.alpinelinux.org/packages

คุณแน่ใจเหรอ จากกระทู้นี้ดูเหมือนว่ามันไม่ได้ทำอะไรเลยจริง ๆ : forum.alpinelinux.org/forum/general-discussion/ …
Travis Reeder

2
@TravisR ลองดูที่เอกสารอัลไพน์เอพีเคที่นี่
ไกเซอร์

ในกรณีของฉันมันช่วยลดระดับจากอัลไพน์ 3.7 เป็นอัลไพน์ 3.6!
DUzun

Semver ช่วงตัวหนอนยังทำงานในขณะที่ความหมายapk add ansible~=2.4.1 >=2.4.1 <2.5.0ตรวจสอบjubianchi.github.io/semver-checkเพื่อทดสอบช่วงของคุณเอง
Mike D

repo ที่มีรายการแพคเกจที่มีอยู่pkgs.alpinelinux.org/packagesมีประโยชน์มากที่สุดสำหรับฉัน
Egel

16

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

# cat /etc/alpine-release
3.3.3

# echo 'http://dl-cdn.alpinelinux.org/alpine/v3.2/main' >> /etc/apk/repositories

# apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.2/main/x86_64/APKINDEX.tar.gz

# apk add bash==4.3.33-r0
(1/1) Updating pinning bash (4.3.33-r0)
OK: 13 MiB in 17 packages

# apk add bash==4.3.42-r3
(1/2) Upgrading bash (4.3.33-r0 -> 4.3.42-r3)
Executing bash-4.3.42-r3.post-upgrade
(2/2) Purging ncurses5-libs (5.9-r1)
Executing busybox-1.24.1-r7.trigger
OK: 13 MiB in 16 packages

1

เพราะฉันใช้testingrepo ฉันสิ้นสุดการสร้างสำเนาของตัวเอง ขั้นตอน:

ไปที่รายละเอียดแพ็คเกจ Ex:

https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman

คลิกที่คอมมิชชันคลิกที่ลิงก์ไฟล์ APKBUILD และ "บันทึก" บนเมนูเพื่อรับบันทึกการคอมมิชชันของไฟล์ APKBUILD จากนั้นเลือกส่งไฟล์ APKBUILD ของคุณแล้วดาวน์โหลด Ex:

https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

ติดตั้งเครื่องมือสร้าง:

apk -U add alpine-sdk

คุณต้องไม่ใช่rootผู้ใช้ดังนั้นให้สร้างpackagerผู้ใช้ด้วยรหัสผ่าน:

adduser -D packager && addgroup packager abuild
passwd packager

จากนั้นสร้างมันpackagerในไดเรกทอรีเดียวกับไฟล์ APKBUILD:

su - packager
abuild-keygen -a -i
abuild -r

คุณอาจจำเป็นต้องเข้าใจข้อผิดพลาดและติดตั้งการพึ่งพา ในตัวอย่างของฉันฉันต้องทำสิ่งนี้ในอิมเมจ Docker ที่มีอยู่ของฉันเป็นroot:

apk add python-dev

หลังจากบิวด์สำเร็จเป็นpackagerติดตั้งเป็นroot:

apk add /home/packager/packages/<something...>/watchman-4.7.0-r0.apk --allow-untrusted

ไม่แน่ใจวิธีถอดชิ้น--allow-untrustedส่วนออก แต่ขั้นตอนทำงานได้ดีสำหรับฉัน

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