主要改动: - Docker Compose 配置优化: * 为所有环境的 MySQL 服务添加 stop_grace_period: 60s(增加优雅关闭时间) * 添加 stop_signal: SIGTERM(使用 SIGTERM 信号优雅停止) * 添加 init: true(使用 init 进程管理子进程,避免僵尸进程) - Makefile 改进: * 所有 docker-down-* 命令添加自动重试机制 * 自动检测权限错误并重启 rootless Docker 服务 * 显示完整的 Docker Compose 进度信息(包括容器状态变化) - README.md 更新: * 添加 Docker 权限问题的详细解决方案 * 包括 rootless Docker 的特殊处理方法和自动重试机制说明 问题原因: MySQL 容器在 rootless Docker 环境下停止时遇到权限问题,需要更长的优雅关闭时间来处理 InnoDB 数据文件。 解决方案: 1. 增加 stop_grace_period 到 60 秒,给 MySQL 足够时间优雅关闭 2. 使用 init 进程管理子进程,避免权限问题 3. 在 Makefile 中添加自动检测和重试机制,无需手动重启 Docker 服务
64 lines
1.4 KiB
Docker
64 lines
1.4 KiB
Docker
# 多阶段构建
|
|
# 使用阿里云镜像加速(如需使用官方镜像,请配置 Docker 镜像加速器)
|
|
FROM golang:1.24-alpine AS builder
|
|
|
|
# 设置 Go 代理(中国大陆用户)
|
|
ENV GOPROXY=https://goproxy.cn,direct
|
|
ENV GOSUMDB=sum.golang.google.cn
|
|
|
|
# 设置工作目录
|
|
WORKDIR /app
|
|
|
|
# 安装必要的包
|
|
RUN apk add --no-cache git ca-certificates tzdata
|
|
|
|
# 复制 go mod 文件
|
|
COPY go.mod go.sum ./
|
|
|
|
# 下载依赖
|
|
RUN go mod download
|
|
|
|
# 复制源代码
|
|
COPY . .
|
|
|
|
# 构建应用
|
|
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o main src/main.go
|
|
|
|
# 最终镜像
|
|
# 使用阿里云镜像加速(如需使用官方镜像,请配置 Docker 镜像加速器)
|
|
FROM alpine:latest
|
|
|
|
# 安装必要的包
|
|
RUN apk --no-cache add ca-certificates tzdata
|
|
|
|
# 设置时区
|
|
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
|
|
RUN echo 'Asia/Shanghai' >/etc/timezone
|
|
|
|
# 创建非root用户
|
|
RUN addgroup -g 1001 -S appgroup && \
|
|
adduser -u 1001 -S appuser -G appgroup
|
|
|
|
# 设置工作目录
|
|
WORKDIR /app
|
|
|
|
# 从构建阶段复制二进制文件
|
|
COPY --from=builder /app/main .
|
|
COPY --from=builder /app/config ./config
|
|
|
|
# 更改文件所有者
|
|
RUN chown -R appuser:appgroup /app
|
|
|
|
# 切换到非root用户
|
|
USER appuser
|
|
|
|
# 暴露端口
|
|
EXPOSE 1234
|
|
|
|
# 健康检查
|
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
CMD wget --no-verbose --tries=1 --spider http://localhost:1234/health || exit 1
|
|
|
|
# 启动应用
|
|
CMD ["./main"]
|