48 lines
1.6 KiB
Docker
48 lines
1.6 KiB
Docker
FROM golang:1.21-alpine AS builder
|
||
ENV CGO_ENABLED=0
|
||
ENV GO111MODULE=on
|
||
ENV GOPROXY=https://goproxy.cn,direct
|
||
# 只安装构建所需的工具
|
||
RUN apk add --no-cache git
|
||
WORKDIR /app
|
||
|
||
# 复制 go.work 文件(用于工作区配置,必须在项目根目录)
|
||
COPY go.work go.work.sum* ./
|
||
|
||
# 复制 server 模块的依赖文件(先复制依赖文件以利用 Docker 缓存)
|
||
COPY server/go.mod server/go.sum ./server/
|
||
WORKDIR /app/server
|
||
RUN go mod download
|
||
|
||
# 复制 grpc/user/userv1 模块的依赖文件
|
||
WORKDIR /app
|
||
COPY grpc/user/userv1/go.mod grpc/user/userv1/go.sum ./grpc/user/userv1/
|
||
WORKDIR /app/grpc/user/userv1
|
||
RUN go mod download
|
||
|
||
# 复制所有源代码(包括生成的 proto 文件)
|
||
# 注意:必须在 go.work 所在的目录下构建,才能正确识别工作区
|
||
WORKDIR /app
|
||
COPY server/ ./server/
|
||
COPY grpc/user/userv1/ ./grpc/user/userv1/
|
||
|
||
# 构建应用(在项目根目录,go.work 会自动生效)
|
||
# 使用 -ldflags 减小二进制文件大小,移除调试信息
|
||
WORKDIR /app/server
|
||
RUN go build -ldflags="-w -s" -trimpath -o /out/server ./cmd/server/main.go
|
||
|
||
# 使用最小化的 alpine 镜像(包含时区支持,应用需要 loc=Local)
|
||
FROM alpine:3.19
|
||
# 只安装运行时必需的包:时区和 CA 证书(用于可能的 HTTPS 连接)
|
||
RUN apk add --no-cache ca-certificates tzdata && \
|
||
# 创建非 root 用户
|
||
addgroup -g 1000 appuser && \
|
||
adduser -D -u 1000 -G appuser appuser && \
|
||
# 清理缓存
|
||
rm -rf /var/cache/apk/*
|
||
WORKDIR /app
|
||
COPY --from=builder /out/server /app/server
|
||
EXPOSE 8077
|
||
USER appuser:appuser
|
||
ENTRYPOINT ["/app/server"]
|