# ==================== 第一阶段:构建Go程序(构建阶段)==================== # 使用官方Go镜像作为构建基础,选择与项目匹配的Go版本(示例用1.25.0,可根据实际调整) FROM golang:1.25.0-alpine3.22 AS builder # 设置工作目录(容器内的目录,规范文件位置) WORKDIR /app # 复制go.mod和go.sum(先复制依赖文件,利用Docker缓存机制,避免每次代码变动都重新下载依赖) COPY go.mod go.sum ./ # 下载项目依赖(仅当go.mod/go.sum变动时才会重新执行) RUN go mod download # 复制整个项目代码到工作目录 COPY . . # 构建Go程序: # - CGO_ENABLED=0:禁用CGO,生成静态链接的二进制文件(避免依赖系统库,保证镜像兼容性) # - -o app:指定输出二进制文件名为app # - ./main.go:指定入口文件 RUN CGO_ENABLED=0 GOOS=linux go build -o app ./main.go # ==================== 第二阶段:运行程序(运行阶段)==================== # 使用轻量级的alpine镜像(仅5MB左右,大幅减小最终镜像体积) FROM alpine:3.19 # 设置工作目录 WORKDIR /app # 从构建阶段复制编译好的二进制文件到当前镜像(仅复制最终产物,减小体积) COPY --from=builder /app/app ./ # 暴露程序运行端口(与代码中一致) EXPOSE 8080 # 容器启动时执行的命令:运行二进制文件 CMD ["./app"]