Gambar "tertutup" hanya berisi aplikasi Anda dan dependensi runtime. Mereka tidak mengandung manajer paket, shell atau program lain yang Anda harapkan untuk ditemukan dalam distribusi Linux standar.
Untuk informasi lebih lanjut, lihat pembicaraan ini (video).
Sejak Maret 2023, gambar tertutup menggunakan manifes OCI, jika Anda melihat kesalahan yang merujuk pada application/vnd.oci.image.manifest.v1+json
atau application/vnd.oci.image.index.v1+json
, perbarui perkakas kontainer Anda (Docker, jib, dll) terbaru.
Membatasi apa yang ada dalam wadah runtime Anda untuk apa yang diperlukan untuk aplikasi Anda adalah praktik terbaik yang digunakan oleh Google dan raksasa teknologi lainnya yang telah menggunakan wadah dalam produksi selama bertahun -tahun. Ini meningkatkan sinyal ke kebisingan pemindai (misalnya CVE) dan mengurangi beban menetapkan sumber untuk apa yang Anda butuhkan.
Gambar tertutup sangat kecil . Gambar tertutup terkecil, gcr.io/distroless/static-debian12
, adalah sekitar 2 mib. Itu sekitar 50% dari ukuran alpine
(~ 5 MIB), dan kurang dari 2% dari ukuran debian
(124 MIB).
Gambar -gambar ini dibangun menggunakan bazel, tetapi mereka juga dapat digunakan melalui alat pembuatan gambar Docker lainnya.
Gambar -gambar berikut saat ini diterbitkan dan diperbarui oleh Proyek Terpatas (lihat Support_Policy untuk jadwal dukungan)
Gambar | Tag | Sufiks arsitektur |
---|---|---|
gcr.io/distroless/static-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/base-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/base-nossl-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/cc-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/python3-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64 |
gcr.io/distroless/java-base-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, S390X, PPC64LE |
gcr.io/distroless/java17-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, S390X, PPC64LE |
gcr.io/distroless/java21-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, PPC64LE |
gcr.io/distroless/nodejs18-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/nodejs20-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/nodejs22-debian12 | Terbaru, non-root, debug, debug-nonroot | AMD64, ARM64, ARM, S390X, PPC64LE |
Gambar -gambar ini merujuk pada indeks gambar dengan referensi ke semua arsitektur yang didukung. Gambar spesifik arsitektur dapat dirujuk secara langsung menggunakan sufiks arsitektur tambahan pada tag, seperti gcr.io/distroless/static-debian12:latest-amd64
Tag lain yang dianggap sudah usang dan tidak lagi diperbarui
Semua gambar tertutup ditandatangani oleh COSIGN dengan tombol -tombol stremeral (tanpa kunci) - Ini adalah satu -satunya mekanisme yang didukung mulai November 2023. Kami sarankan memverifikasi gambar tertutup yang Anda gunakan sebelum membangun gambar Anda. Anda dapat memverifikasi tanda tangan tanpa kunci dari gambar tertutup apa pun dengan:
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
Perhatikan bahwa gambar tertutup secara default tidak mengandung shell. Itu berarti perintah DockerFile ENTRYPOINT
, bila didefinisikan, harus ditentukan dalam bentuk vector
, untuk menghindari prefixing runtime wadah dengan shell.
Ini berhasil:
ENTRYPOINT ["myapp"]
Tapi ini tidak berhasil:
ENTRYPOINT "myapp"
Untuk alasan yang sama, jika titik masuk diatur ke vektor kosong, perintah CMD harus ditentukan dalam bentuk vector
(lihat contoh di bawah). Perhatikan bahwa secara statis default, basis dan gambar CC memiliki titik entri vektor kosong. Gambar dengan runtime bahasa yang disertakan memiliki default spesifik bahasa (lihat: Java, Nodejs, Python3).
Docker Multi-Stage Build membuat menggunakan gambar tertutup mudah. Ikuti langkah -langkah ini untuk memulai:
Pilih gambar dasar yang tepat untuk tumpukan aplikasi Anda.
Tulis file Docker multi-tahap. Catatan: Ini membutuhkan Docker 17.05 atau lebih tinggi.
Ide dasarnya adalah Anda memiliki satu tahap untuk membangun artefak aplikasi Anda, dan memasukkannya ke dalam gambar runtime tertutup Anda. Jika Anda ingin mempelajari lebih lanjut, silakan lihat dokumentasi pada build multi-tahap.
Inilah contoh singkat untuk Go:
# 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" ]
Anda dapat menemukan contoh lain di sini:
Untuk menjalankan contoh apa pun, buka direktori untuk bahasa dan jalankan
docker build -t myapp .
docker run -t myapp
Untuk menjalankan Node.js Express App Node-Express dan mengekspos port wadah:
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
Ini harus mengekspos aplikasi ekspres ke localhost Anda: 3000
Untuk dokumentasi lengkap tentang cara menggunakan Bazel untuk menghasilkan gambar kontainer, lihat repositori Bazel-Contrib/Rules_oci.
Untuk dokumentasi dan contoh tentang cara menggunakan Debian Package Manager berbasis GO (saat ini) untuk menghasilkan konfigurasi Bazel, lihat ./debian_package_manager untuk dokumentasi dan contoh tentang cara menggunakan aturan manajer paket Bazel (tidak digunakan dalam repo ini), lihat. /package_manager
Contoh dapat ditemukan di repositori ini di direktori contoh.
Kami memiliki beberapa contoh tentang cara menjalankan beberapa tumpukan aplikasi umum di direktori /contoh. Lihat di sini untuk:
Lihat di sini untuk contoh tentang cara menyelesaikan beberapa tugas umum dalam gambar Anda:
Lihat di sini untuk informasi lebih lanjut tentang bagaimana gambar -gambar ini dibangun dan dirilis.
Gambar tertutup didasarkan pada Debian 12 (kutu buku). Gambar secara eksplisit ditandai dengan sufiks versi Debian (misalnya -debian12
). Menentukan gambar tanpa distribusi saat ini akan memilih -debian12
gambar, tetapi itu akan berubah di masa depan menjadi versi Debian yang lebih baru. Dapat bermanfaat untuk merujuk distribusi secara eksplisit, untuk mencegah pembuatan kerusakan saat versi Debian berikutnya dirilis.
Terputus melacak rilis Debian hulu, menggunakan tindakan GitHub untuk secara otomatis menghasilkan permintaan tarik ketika ada pembaruan.
Gambar tertutup minim dan tidak memiliki akses shell. :debug
set untuk setiap bahasa menyediakan shell kotak sibuk untuk dimasukkan.
Misalnya:
cd examples/python3/
Edit Dockerfile
untuk mengubah gambar akhir menjadi :debug
:
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]
Kemudian bangun dan luncurkan dengan titik masuk shell:
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
Catatan: Jika gambar yang Anda gunakan sudah memiliki tag, misalnya
gcr.io/distroless/java17-debian12:nonroot
, gunakan tagdebug-<existing tag>
sebagai contoh, misalnyagcr.io/distroless/java17-debian12:debug-nonroot
.
Catatan: LDD tidak diinstal pada gambar dasar karena ini adalah skrip shell, Anda dapat menyalinnya atau mengunduhnya.
Jika proyek Anda menggunakan Distoless, kirim PR untuk menambahkan proyek Anda di sini!