如何 减少 docker 的镜像大小,今天又学一招

分类:Docker |

今天打包一个go的安装包:

image.png

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


image.png


参考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 内的服务压测结果不是太理想:
image.png



直接本机的服务,相差3倍之多,可能是docker虚拟网卡的原因,此处留个问号??


image.png