Dockerfile 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # 构建阶段(使用新版官方镜像)
  2. FROM golang:1.21-alpine3.19 AS builder
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 配置Alpine镜像源(使用新版)
  6. RUN echo -e "https://mirrors.aliyun.com/alpine/v3.19/main\nhttps://mirrors.aliyun.com/alpine/v3.19/community" > /etc/apk/repositories
  7. # 安装构建依赖(添加upgrade确保索引最新)
  8. RUN apk add --no-cache --upgrade \
  9. gcc \
  10. g++ \
  11. musl-dev \
  12. sqlite-dev \
  13. make
  14. # 配置Go环境
  15. ENV GOPROXY=https://goproxy.cn,direct \
  16. CGO_ENABLED=1 \
  17. GOOS=linux \
  18. GOARCH=amd64
  19. # 复制依赖文件先进行缓存
  20. COPY go.mod go.sum ./
  21. RUN go mod download
  22. # 复制项目代码
  23. COPY . .
  24. # 构建可执行文件(添加-ldflags优化)
  25. RUN go build -ldflags="-w -s" -o /app/main cmd/main.go
  26. # 运行时阶段
  27. FROM alpine:3.19
  28. # 配置镜像源和基础依赖
  29. RUN echo -e "https://mirrors.aliyun.com/alpine/v3.19/main\nhttps://mirrors.aliyun.com/alpine/v3.19/community" > /etc/apk/repositories \
  30. && apk update \
  31. && apk add --no-cache --upgrade \
  32. sqlite-libs \
  33. libc6-compat \
  34. ca-certificates \
  35. tzdata
  36. # 设置容器时区
  37. ENV TZ=Asia/Shanghai
  38. # 创建专用用户
  39. RUN addgroup -S appgroup && adduser -S appuser -G appgroup
  40. # 设置工作目录并转移所有权
  41. WORKDIR /app
  42. RUN mkdir -p /app/data/json_files
  43. COPY --from=builder --chown=appuser:appgroup /app/main .
  44. COPY --chown=appuser:appgroup config.yaml .
  45. COPY --chown=appuser:appgroup data/json_files ./data/json_files
  46. # 设置权限
  47. RUN chmod 755 /app/main \
  48. && chmod 644 config.yaml \
  49. && chmod -R 755 /app/data
  50. # 切换到非root用户
  51. USER appuser
  52. # 健康检查
  53. HEALTHCHECK --interval=30s --timeout=3s \
  54. CMD wget --spider http://localhost:8080/healthz || exit 1
  55. # 暴露端口
  56. EXPOSE 8080
  57. # 启动命令
  58. ENTRYPOINT ["./main"]
  59. CMD ["server"]