ภาพ "distroless" มีเฉพาะแอปพลิเคชันของคุณและการพึ่งพารันไทม์ พวกเขาไม่มีผู้จัดการแพ็คเกจเชลล์หรือโปรแกรมอื่น ๆ ที่คุณคาดหวังว่าจะพบในการกระจาย Linux มาตรฐาน
สำหรับข้อมูลเพิ่มเติมดูการพูดคุยนี้ (วิดีโอ)
ตั้งแต่เดือนมีนาคม 2566 ภาพ distroless จะใช้ OCI ปรากฏขึ้นหากคุณเห็นข้อผิดพลาดที่อ้างอิง application/vnd.oci.image.manifest.v1+json หรือ application/vnd.oci.image.index.v1+json อัปเดตเครื่องมือคอนเทนเนอร์ของคุณ (Docker jib ฯลฯ ) เป็นล่าสุด
การ จำกัด สิ่งที่อยู่ในคอนเทนเนอร์รันไทม์ของคุณเป็นสิ่งที่จำเป็นสำหรับแอปของคุณเป็นแนวปฏิบัติที่ดีที่สุดที่ใช้โดย Google และยักษ์ใหญ่ด้านเทคโนโลยีอื่น ๆ ที่ใช้ภาชนะในการผลิตมาหลายปี มันช่วยปรับปรุงสัญญาณเสียงของเครื่องสแกน (เช่น CVE) และลดภาระในการสร้างที่มาให้เป็นสิ่งที่คุณต้องการ
ภาพที่เดือดร้อนมี ขนาดเล็กมาก ภาพที่มีความเสี่ยงน้อยที่สุด gcr.io/distroless/static-debian12 อยู่ที่ประมาณ 2 Mib นั่นคือประมาณ 50% ของขนาด alpine (~ 5 MIB) และน้อยกว่า 2% ของขนาด debian (124 MIB)
ภาพเหล่านี้ถูกสร้างขึ้นโดยใช้ Bazel แต่ยังสามารถใช้ผ่านเครื่องมือสร้างภาพนักเทียบท่าอื่น ๆ
ภาพต่อไปนี้ได้รับการเผยแพร่และอัปเดตโดยโครงการ Distroless (ดู support_policy สำหรับระยะเวลาสนับสนุน)
| ภาพ | แท็ก | คำต่อท้ายสถาปัตยกรรม |
|---|---|---|
| gcr.io/distroless/static-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
| gcr.io/distroless/base-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
| gcr.io/distroless/base-nossl-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
| gcr.io/distroless/cc-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
| gcr.io/distroless/python3-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64 |
| gcr.io/distroless/java-base-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, S390X, PPC64LE |
| gcr.io/distroless/java17-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, S390X, PPC64LE |
| gcr.io/distroless/java21-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, PPC64LE |
| gcr.io/distroless/nodejs18-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
| gcr.io/distroless/nodejs20-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
| gcr.io/distroless/nodejs22-debian12 | ล่าสุด nonroot, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
ภาพเหล่านี้อ้างถึงดัชนีภาพที่มีการอ้างอิงถึงสถาปัตยกรรมที่รองรับทั้งหมด ภาพเฉพาะสถาปัตยกรรมสามารถอ้างอิงโดยตรงโดยใช้คำต่อท้ายสถาปัตยกรรมเพิ่มเติมบนแท็กเช่น gcr.io/distroless/static-debian12:latest-amd64
แท็กอื่น ๆ จะถูกพิจารณาว่าเลิกใช้แล้วและไม่ได้รับการปรับปรุงอีกต่อไป
ภาพที่ไม่เหมาะสมทั้งหมดได้รับการลงนามโดย cosign ด้วย keys ongerseral (keyless) - นี่เป็นกลไกที่ได้รับการสนับสนุนเพียงอย่างเดียวตั้งแต่เดือนพฤศจิกายน 2023 เราขอแนะนำให้ตรวจสอบภาพที่คุณใช้ก่อนที่จะสร้างภาพของคุณ คุณสามารถตรวจสอบลายเซ็นแบบไร้สาระของภาพที่ไม่เหมาะสมด้วย:
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
โปรดทราบว่าภาพที่รบกวนโดยค่าเริ่มต้นไม่มีเชลล์ นั่นหมายถึงคำสั่ง dockerfile ENTRYPOINT เมื่อกำหนดจะต้องระบุในรูปแบบ vector เพื่อหลีกเลี่ยงคำนำหน้ารันไทม์คอนเทนเนอร์ด้วยเชลล์
ผลงานนี้:
ENTRYPOINT ["myapp"]
แต่สิ่งนี้ไม่ได้ผล:
ENTRYPOINT "myapp"
ด้วยเหตุผลเดียวกันหากจุดเข้าใช้งานถูกตั้งค่าเป็นเวกเตอร์เปล่าควรระบุคำสั่ง CMD ในรูปแบบ vector (ดูตัวอย่างด้านล่าง) โปรดทราบว่าภาพคงที่ฐานและ CC เริ่มต้นมีจุดเข้าใช้เวกเตอร์ว่างเปล่า รูปภาพที่มีรันไทม์ภาษาที่รวมอยู่มีค่าเริ่มต้นเฉพาะภาษา (ดู: java, nodejs, python3)
Docker Multi-Stage Builds สร้างภาพโดยใช้ภาพ distroless ได้ง่าย ทำตามขั้นตอนเหล่านี้เพื่อเริ่มต้น:
เลือกภาพฐานที่เหมาะสมสำหรับแอปพลิเคชันสแต็กของคุณ
เขียนไฟล์ Docker หลายขั้นตอน หมายเหตุ: สิ่งนี้ต้องใช้ Docker 17.05 หรือสูงกว่า
แนวคิดพื้นฐานคือคุณจะมีขั้นตอนเดียวในการสร้างสิ่งประดิษฐ์แอปพลิเคชันของคุณและแทรกลงในภาพรันไทม์เดิมพันของคุณ หากคุณต้องการเรียนรู้เพิ่มเติมโปรดดูเอกสารเกี่ยวกับการสร้างหลายขั้นตอน
นี่คือตัวอย่างที่รวดเร็วสำหรับการเดินทาง:
# Start by building the application.
FROM golang:1.18 as build
WORKDIR /go/src/app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -o /go/bin/app
# Now copy it into our base image.
FROM gcr.io/distroless/static-debian12
COPY --from=build /go/bin/app /
CMD [ "/app" ]คุณสามารถค้นหาตัวอย่างอื่น ๆ ได้ที่นี่:
หากต้องการเรียกใช้ตัวอย่างใด ๆ ให้ไปที่ไดเรกทอรีสำหรับภาษาและเรียกใช้
docker build -t myapp .
docker run -t myapp
ในการรันแอป Node.js Express Node-Express และเปิดเผยพอร์ตของคอนเทนเนอร์:
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
สิ่งนี้ควรเปิดเผยแอปพลิเคชันด่วนไปยัง LocalHost ของคุณ: 3000
สำหรับเอกสารฉบับเต็มเกี่ยวกับวิธีการใช้ Bazel เพื่อสร้างภาพคอนเทนเนอร์ให้ดูที่ที่เก็บ Bazel-Contrib/Rules_oci
สำหรับเอกสารและตัวอย่างเกี่ยวกับวิธีการใช้ Debian Package Manager (ปัจจุบัน) เพื่อสร้าง bazel config ดู./debian_package_manager สำหรับเอกสารและตัวอย่างเกี่ยวกับวิธีการใช้กฎของ Bazel Package Manager (ไม่ได้ใช้ใน repo นี้) ดู /package_manager
ตัวอย่างสามารถพบได้ในที่เก็บนี้ในไดเรกทอรีตัวอย่าง
เรามีตัวอย่างเกี่ยวกับวิธีเรียกใช้สแต็คแอปพลิเคชันทั่วไปในไดเรกทอรี /ตัวอย่าง ดูที่นี่สำหรับ:
ดูที่นี่สำหรับตัวอย่างเกี่ยวกับวิธีการทำงานทั่วไปในภาพของคุณ:
ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการสร้างและเผยแพร่ภาพเหล่านี้
ภาพที่มีความเดือดร้อนขึ้นอยู่กับ Debian 12 (Bookworm) รูปภาพถูกแท็กอย่างชัดเจนด้วยคำต่อท้ายของ Debian (เช่น -debian12 ) การระบุรูปภาพที่ไม่มีการแจกแจงจะเลือกภาพ -debian12 ในปัจจุบัน แต่จะเปลี่ยนไปในอนาคตเป็น Debian รุ่นใหม่ มันจะมีประโยชน์ในการอ้างอิงการแจกแจงอย่างชัดเจนเพื่อป้องกันการทำลายการสร้างเมื่อรุ่นเดเบียนถัดไปถูกปล่อยออกมา
Distroless ติดตามการเปิดตัว Debian ต้นน้ำโดยใช้การกระทำของ GitHub เพื่อสร้างคำขอดึงโดยอัตโนมัติเมื่อมีการอัปเดต
ภาพที่รบกวนน้อยที่สุดและขาดการเข้าถึงเปลือก ชุด :debug Image สำหรับแต่ละภาษาให้เชลล์ BusyBox ที่จะป้อน
ตัวอย่างเช่น:
cd examples/python3/
แก้ไข Dockerfile เพื่อเปลี่ยนภาพสุดท้ายเป็น :debug :
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]จากนั้นสร้างและเปิดตัวด้วยจุดเข้าเชลล์:
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
หมายเหตุ: หากภาพที่คุณใช้มีแท็กอยู่แล้วตัวอย่างเช่น
gcr.io/distroless/java17-debian12:nonrootให้ใช้แท็กdebug-<existing tag>เช่นgcr.io/distroless/java17-debian12:debug-nonroot
หมายเหตุ: LDD ไม่ได้ติดตั้งในอิมเมจพื้นฐานเนื่องจากเป็นเชลล์สคริปต์คุณสามารถคัดลอกหรือดาวน์โหลดได้
หากโครงการของคุณใช้ Distroless ให้ส่ง PR เพื่อเพิ่มโครงการของคุณที่นี่!