Pada hujung minggu saya sedang melakukan penyelidikan tentang imej buruh pelabuhan khusus untuk digunakan dengan aplikasi Go (Golang). Oleh itu, terfikir untuk berkongsi penemuan menarik kerana ia mungkin berguna kepada seseorang yang meneroka perkara yang sama untuk kerja projek teknologi mereka.
Di sini, saya akan menghuraikan beberapa cara berbeza kita boleh membina imej untuk Golang dan juga menyerlahkan beberapa pertimbangan keselamatan yang perlu kita ambil kira semasa memilih satu.
Untuk latihan ini saya menggunakan API Rehat mudah yang dibangunkan menggunakan Go (Golang) menggunakan Rangka Kerja Gin.
Rangka kerja Gin ialah rangka kerja web popular untuk Go (Golang) yang direka bentuk agar pantas, mudah digunakan dan sangat cekap.
Berikut ialah ringkasan ringkas ciri dan ciri utamanya;
Ciri Utama
Prestasi: Gin terkenal dengan prestasinya yang tinggi. Ia merupakan salah satu rangka kerja web Go terpantas, memberikan overhed minimum berbanding rangka kerja lain.
Penghala HTTP Pantas: Gin menggunakan penghala HTTP pantas dan menyokong penghalaan dengan kaedah seperti GET, POST, PUT, DELETE, dll. Ia juga menyokong perisian tengah dan kumpulan laluan.
Sokongan Perisian Tengah: Gin menyediakan cara untuk menggunakan perisian tengah untuk mengendalikan tugas seperti pengelogan, pengesahan dan permintaan pra atau pasca pemprosesan yang lain.
Pengesahan JSON: Rangka kerja ini menawarkan sokongan terbina dalam untuk pengesahan JSON dan data permintaan yang mengikat ke struct Go, menjadikannya lebih mudah untuk bekerja dengan muatan JSON.
Pengendalian Ralat: Gin mempunyai cara berstruktur untuk mengendalikan ralat dan menyediakan sistem pengurusan ralat pusat, membolehkan anda mengendalikan ralat dengan anggun.
Rendering Templat: Walaupun Gin direka terutamanya untuk pembangunan API, ia menyokong pemaparan templat HTML jika perlu.
Pengendalian Permintaan: Menyokong kaedah berbeza untuk pengendalian permintaan termasuk data borang, muatan JSON dan parameter URL.
Penyahpepijatan Terbina dalam: Gin menyediakan mesej ralat terperinci dan maklumat penyahpepijatan yang boleh berguna semasa pembangunan.
Penghala: Komponen teras yang mengendalikan penghalaan permintaan HTTP kepada pengendali yang sesuai.
Konteks: Struktur yang membawa data permintaan dan tindak balas, dan
menyediakan kaedah untuk mengendalikannya. Ia digunakan secara meluas dalam pengendali.
Enjin: Contoh utama aplikasi Gin, yang dikonfigurasikan dengan laluan, perisian tengah dan tetapan lain.
Perisian Tengah: Fungsi yang dilaksanakan semasa kitaran hayat permintaan, membolehkan anda melaksanakan tugas seperti pengelogan, pengesahan dan banyak lagi
Cukup mengenai Rangka Kerja Gin :) sekarang mari kita beralih ke topik utama dan bercakap tentang Ujian yang dijalankan.
Dalam Ujian ini, kami akan menggunakan Imej Piawaian Rasmi/Go Base Biasa
# Official Go Base Image FROM golang:1.21.0 # Create The Application Working Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy Source and Build The Application COPY . . RUN go build -o main . # Expose The Port EXPOSE 8081 CMD ["./main"]
Saiz Imej
Dalam Ujian ini kita akan menggunakan versi Alpine bagi Go Base Image yang lebih ringan sedikit
# Official Go Apline Base Image FROM golang:1.21.0-alpine as builder # Create The Application Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy The Application Source & Build COPY . . RUN go build -o main . # Final Image Creation Stage FROM alpine:3.19 WORKDIR /root/ # Copy The Built Binary COPY --from=builder /app/main . # Expose the port EXPOSE 8081 CMD ["./main"]
Saiz Imej
Di sini anda dapat melihat bahawa dengan binaan berperingkat saiz imej dikurangkan dengan ketara.
Dalam Ujian ini kami akan menggunakan Imej Pangkalan Go Tanpa Distro Google. Imej tanpa distro dikenali sebagai ringan dan selamat yang mengandungi hanya fail minimum yang diperlukan. Dalam hal ini, cengkerang nyahpepijat dan pakej yang tidak diperlukan ini dialih keluar. oleh itu, anda mengorbankan fleksibiliti untuk memiliki pengurus pakej dan shell.
# Build Stage FROM golang:1.21.0 as builder # Set The Application Directory WORKDIR /app # Copy and Download Dependencies COPY go.mod go.sum . RUN go mod download # Copy The Application Source and Build the application COPY . . RUN CGO_ENABLED=0 go build -o main . # Final Image Creation Stage FROM gcr.io/distroless/static-debian12 # Copy the built binary COPY --from=builder /app/main / CMD ["/main"]
Saiz Imej
CGO_ENABLED=0: Ini ialah tetapan pembolehubah persekitaran yang melumpuhkan CGO (C-Go). CGO ialah ciri Go yang membenarkan pakej Go memanggil kod C. Menetapkan CGO_ENABLED=0 memastikan binaan tidak bergantung pada mana-mana perpustakaan C, menghasilkan binari statik sepenuhnya. Ini berguna untuk mencipta perduaan Go yang ringan dan mudah alih yang boleh dijalankan pada mana-mana sistem tanpa memerlukan kebergantungan tambahan.
Menggabungkan semuanya, RUN CGO_ENABLED=0 go build -o main . bermakna Docker akan melaksanakan arahan untuk membina aplikasi Go dalam direktori semasa, menghasilkan binari statik bernama utama yang tidak bergantung pada mana-mana perpustakaan C.
Saiz Imej
Walaupun imej Distroless lebih besar sedikit daripada imej alpine, pertimbangan keselamatan/kelemahan mungkin memaksa untuk memilih Distroless!. Oleh itu fikirkan semua fakta ini dan pilih yang sepadan dengan keperluan anda
Alpine dengan Binaan Berbilang Peringkat ialah pilihan yang baik jika anda memerlukan lebih kawalan ke atas proses binaan dan jika isu keserasian dengan musl libc tidak satu kebimbangan. Ia memberikan fleksibiliti dan lebih kecil daripada banyak imej asas lain, tetapi masih termasuk lebih banyak komponen daripada imej Distroless yang boleh membawa kepada potensi kelemahan/ancaman keselamatan.
Imej Tanpa Distro Google sesuai untuk memaksimumkan keselamatan dan meminimumkan permukaan serangan. Mereka menyediakan persekitaran masa jalan yang sangat minimum, yang boleh memberi manfaat kepada sistem pengeluaran di mana keselamatan menjadi keutamaan. Walau bagaimanapun, anda mengorbankan fleksibiliti untuk memiliki pengurus pakej dan shell.
Gunakan Alpine jika anda memerlukan fleksibiliti dan kawalan ke atas persekitaran binaan, dan jika isu keserasian dengan musl libc bukanlah masalah.
Gunakan Google Distroless jika keselamatan dan meminimumkan permukaan serangan adalah keutamaan anda dan anda boleh memastikan bahawa aplikasi anda mempunyai semua kebergantungan yang digabungkan dengan betul.
Semoga ini menarik dan terima kasih atas masa anda!
Atas ialah kandungan terperinci Imej Docker untuk Go (Golang) Imej dan Keselamatan Docker Kecil, Lebih Pantas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!