การสร้าง Docker หลายขั้นตอนสำหรับ Go
สร้างขั้นตอน builder และอิมเมจสุดท้ายแบบ scratch/alpine
การสร้าง Docker หลายขั้นตอนสำหรับ Go เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องใช้หลายขั้นตอน
การสร้างแบบขั้นตอนเดียวที่คอมไพล์โค้ด Go จะสร้างอิมเมจขนาดใหญ่ซึ่งมีชุดเครื่องมือ Go ครบถ้วน การสร้างแบบหลายขั้นตอนจะคอมไพล์ในขั้นตอนหนึ่ง แล้วคัดลอกเฉพาะไบนารีไปยังอิมเมจสุดท้ายขนาดเล็ก
Dockerfile แบบหลายขั้นตอนพื้นฐาน
ขั้นตอนการสร้างจะคอมไพล์ไบนารี ส่วนขั้นตอนสุดท้ายจะคัดลอกไบนารีไปยังฐานที่มีขนาดเล็ก:
FROM golang:1.22-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o myapp ./cmd/server
FROM scratch
COPY --from=build /app/myapp /myapp
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/myapp"]FROM scratch
อิมเมจ FROM scratch ไม่มีสิ่งใดอยู่เลย ไม่มีเชลล์และไม่มีไลบรารีของระบบ ไบนารี Go ต้องลิงก์แบบสแตติก (CGO_ENABLED=0) และต้องรวมไฟล์ที่จำเป็นทั้งหมดอย่างชัดเจน
FROM distroless
อิมเมจ distroless ของ Google มีไลบรารีระบบขั้นต่ำ (ใบรับรอง CA และข้อมูลเขตเวลา) โดยไม่มีเชลล์ จึงปลอดภัยกว่า scratch สำหรับไบนารีที่ต้องใช้ libc หรือใบรับรอง TLS
FROM gcr.io/distroless/static-debian12
COPY --from=build /app/myapp /
ENTRYPOINT ["/myapp"]FROM alpine เพื่อใช้เชลล์
ใช้ Alpine เป็นฐานสุดท้ายเมื่อจำเป็นต้องมีเชลล์สำหรับการดีบัก หรือเมื่อไบนารีใช้ CGO Alpine เพิ่มขนาดประมาณ 5MB แต่มีเชลล์และตัวจัดการแพ็กเกจมาให้
การแคชชั้นสำหรับ go.mod
คัดลอก go.mod และ go.sum ก่อน แล้วเรียกใช้ go mod download ก่อนคัดลอกซอร์สโค้ด ชั้นนี้จะถูกแคชจนกว่าการพึ่งพาจะเปลี่ยนแปลง จึงช่วยเร่งการสร้างใหม่
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build ...-ldflags="-s -w"
-s ลบตารางสัญลักษณ์ ส่วน -w ลบข้อมูลการดีบัก DWARF ทั้งสองตัวร่วมกันช่วยลดขนาดไบนารีได้ 30–50% โดยไม่ส่งผลต่อการทำงานขณะรัน
อาร์กิวเมนต์การสร้าง
ใช้ ARG เพื่อแทรกข้อมูลรุ่นขณะสร้าง:
ARG VERSION=dev
RUN go build -ldflags="-X main.version=${VERSION}" -o myapp .ผู้ใช้ที่ไม่ใช่รูท
เรียกใช้ไบนารีในฐานะผู้ใช้ที่ไม่ใช่รูทเพื่อความปลอดภัย เพิ่มผู้ใช้ในอิมเมจฐาน หรือใช้แท็ก nonroot ของ distroless:
FROM gcr.io/distroless/static-debian12:nonrootขนาดอิมเมจสุดท้าย
ไบนารี Go ทั่วไปจาก scratch มีขนาด 5–20 MB Alpine เพิ่มขนาดประมาณ 5MB ส่วนอิมเมจ golang แบบเต็มมีขนาดประมาณ 800MB การสร้างแบบหลายขั้นตอนช่วยลดพื้นที่โจมตีและเวลาในการดึงอิมเมจได้อย่างมาก
.dockerignore
เพิ่ม .dockerignore เพื่อยกเว้นไฟล์จากบริบทการสร้าง: vendor/, .git/, *.test, *.prof วิธีนี้ช่วยเร่งการสร้าง Docker และป้องกันไม่ให้รวมไฟล์ที่มีข้อมูลละเอียดอ่อน
.git
vendor
*.test
*.prof
.envตรวจสอบอย่างรวดเร็ว
เหตุใดจึงต้องตั้งค่า CGO_ENABLED=0 เมื่อสร้างไบนารี Go สำหรับอิมเมจ Docker แบบ FROM scratch
สรุป: การสร้างอิมเมจ Docker แบบหลายขั้นตอน
ประเด็นสำคัญ:
- ขั้นตอนการสร้าง: อิมเมจ golang ขั้นตอนสุดท้าย: scratch/distroless/alpine
- ใช้ CGO_ENABLED=0 เพื่อสร้างไบนารีแบบสแตติก (จำเป็นสำหรับ scratch)
- คัดลอก go.mod ก่อนเพื่อแคชชั้น และใช้ -ldflags="-s -w" เพื่อลดขนาดไบนารี
- ใช้ .dockerignore เพื่อยกเว้น .git, vendor และไฟล์การทดสอบ
คำถามที่พบบ่อย
บทเรียน “การสร้าง Docker หลายขั้นตอนสำหรับ Go” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้าง Docker หลายขั้นตอนสำหรับ Go” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้าง Docker หลายขั้นตอนสำหรับ Go”
สร้างขั้นตอน builder และอิมเมจสุดท้ายแบบ scratch/alpine คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้าง Docker หลายขั้นตอนสำหรับ Go” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้าง Docker หลายขั้นตอนสำหรับ Go
- การกำหนดค่าสภาพแวดล้อมและข้อมูลลับ
- Docker Compose สำหรับการพัฒนาในเครื่อง
- การตรวจสอบสถานะและการปรับแต่งสำหรับการใช้งานจริง