Golang如何做Docker多阶段构建_Golang Docker教程【秒懂】
Go镜像体积大是因为未用多阶段构建,直接将编译环境打包进运行镜像;正确做法是用golang:slim构建、CGO_ENABLED=0静态编译、alpine作基础镜像,并验证DNS与证书。为什么 Go 镜像动辄 800MB,而二进制才 10MB?因为你没分阶段,直接用 golang:latest 或 golang:alpine 构建完就当运行镜像用了——编译器、go.mod、$GOPATH、测试文件全塞进去了,Docker 层也没清理。Go 编译产物是静态二进制(前提是关掉 CGO),根本不需要 /bin/sh、apk、git,更不依赖 glibc。多阶段构建就是靠两个 FROM 指令物理隔离:一个装工具链只编译,一个空着身子只跑程序。FROM golang:1.22-slim AS builder —— 用 -slim 而非 latest,tag 固定,CI 可复现RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-s -w' -o /app/main . —— -s -w 去符号表和调试信息,体积直降 30%~50%别在 builder 阶段 RUN rm -rf $GOPATH,那只是删文件,层还在,镜像大小不变scratch 还是 alpine:latest?选错就 panic不是所有 Go 程序都能扔进 scratch。它真的一无所有:没有 /etc/resolv.conf、没有 /dev/null、没有 /tmp,连 os.UserHomeDir() 都会 panic。典型报错:lookup example.com: no such host 或 exec user process caused: no such file or directory(其实是找不到动态加载器)。立即学习“go语言免费学习笔记(深入)”; AI智研社 AI智研社是一个专注于人工智能领域的综合性平台
更多推荐
所有评论(0)