如何 减少 docker 的镜像大小,今天又学一招
今天打包一个go的安装包:

优化后: 只打包生成后的可执行文件即可:源码之类的完全没必要打包到docker 内, 如果是php则使用挂载盘,更合理一些,也会减少镜像大小

参考1:
# 使用官方 Go 镜像作为构建环境 # FROM golang:1.23-alpine AS builder FROM golang:1.25-alpine3.23 AS builder # 设置工作目录 WORKDIR /app # 复制项目文件 COPY . . # 编译可执行文件 # RUN go mod tidy && go build -o myapp main.go RUN go mod tidy && go build -o myapp /app/app/api/main.go ## 使用最小的基础镜像来减少体积 FROM alpine:latest # 设置工作目录 WORKDIR /app # 复制可执行文件到新镜像 # COPY --from=builder myapp /usr/local/bin/myapp COPY --from=builder /app/myapp myapp # 复制配置文件到容器的 /config 目录 COPY --from=builder /app/config config COPY --from=builder /app/public public # 暴露应用的端口(如 HTTP 服务器使用的 8080 端口) EXPOSE 9999 # 启动命令 ENTRYPOINT ["/app/myapp"] # socks5://127.0.0.1:10808 # docker build -t my-go-app1 -f Dockerfile . # docker run -p 9999:9999 my-go-app # docker run --network host -d my-go-app # 测试和监控 # 使用 Docker stats 监控资源使用: # docker stats <container_id>
参考2:
# 使用官方 Go 镜像作为构建环境 FROM golang:1.25-alpine3.23 AS builder # 设置构建环境变量 ENV GO111MODULE=on \ GOPROXY=https://goproxy.io,direct \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=arm64 # GOARCH=amd64 # 安装必要的依赖 RUN apk add --no-cache git # 设置工作目录 WORKDIR /app # 复制 go.mod 和 go.sum 文件,利用缓存 COPY go.mod go.sum ./ # 下载依赖 RUN go mod tidy # 复制项目文件 COPY . . # 编译可执行文件(使用编译优化) RUN go build -ldflags "-s -w" -o myapp /app/app/api/main.go # 使用最小的基础镜像 FROM alpine:3.23 AS final # 安装必要的依赖(如 CA 证书) RUN apk add --no-cache ca-certificates tzdata # 设置时区 ENV TZ=Asia/Shanghai # 创建非 root 用户 RUN addgroup -g 1001 -S appgroup && \ adduser -u 1001 -S appuser -G appgroup # 设置工作目录 WORKDIR /app # 复制可执行文件和配置文件(使用非 root 用户权限) COPY --from=builder --chown=appuser:appgroup /app/myapp . COPY --from=builder --chown=appuser:appgroup /app/config ./config COPY --from=builder --chown=appuser:appgroup /app/public ./public # 切换到非 root 用户 USER appuser # 暴露应用的端口 EXPOSE 9999 # 启动命令 ENTRYPOINT ["/app/myapp"] # socks5://127.0.0.1:10808 # docker build -t my-go-app1 -f Dockerfile . # docker run -p 9999:9999 my-go-app # docker run --network host -d my-go-app # 测试和监控 # 使用 Docker stats 监控资源使用: # docker stats <container_id>
只在docker 内的服务压测结果不是太理想:
直接本机的服务,相差3倍之多,可能是docker虚拟网卡的原因,此处留个问号??
