Dockerfile 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # 构建阶段(使用Debian基础镜像保证glibc兼容性)
  2. FROM golang:1.21-bullseye AS builder
  3. # 配置Go环境
  4. ENV GOPROXY=https://goproxy.cn,direct \
  5. CGO_ENABLED=1 \
  6. GOOS=linux \
  7. GOARCH=amd64 \
  8. GO111MODULE=on
  9. # 安装构建依赖
  10. RUN apt-get update && apt-get install -y \
  11. gcc \
  12. g++ \
  13. libsqlite3-dev \
  14. pkg-config \
  15. && rm -rf /var/lib/apt/lists/*
  16. WORKDIR /app
  17. # 复制依赖清单
  18. COPY go.mod go.sum ./
  19. RUN go mod download
  20. # 复制源代码
  21. COPY . .
  22. # 构建优化参数
  23. RUN go build -v -ldflags="-w -s -linkmode external -extldflags '-static'" \
  24. -tags "osusergo netgo sqlite_omit_load_extension" \
  25. -o /app/main cmd/main.go
  26. # 运行时阶段
  27. FROM debian:bullseye-slim
  28. # 设置容器时区
  29. ENV TZ=Asia/Shanghai
  30. RUN apt-get update && apt-get install -y \
  31. ca-certificates \
  32. tzdata \
  33. libsqlite3-0 \
  34. curl \
  35. && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
  36. && echo $TZ > /etc/timezone \
  37. && rm -rf /var/lib/apt/lists/*
  38. # 创建专用用户(固定uid/gid)
  39. RUN groupadd -g 10001 appgroup && \
  40. useradd -u 10001 -g appgroup -d /app -s /sbin/nologin appuser
  41. # 设置工作目录
  42. WORKDIR /app
  43. # 从构建阶段复制文件
  44. COPY --from=builder --chown=appuser:appgroup /app/main .
  45. COPY --chown=appuser:appgroup config.yaml .
  46. COPY --chown=appuser:appgroup --from=builder /app/data/json_files ./data/json_files
  47. # 初始化容器环境
  48. RUN mkdir -p /app/data \
  49. && chown -R appuser:appgroup /app \
  50. && chmod 755 /app/main \
  51. && chmod 644 config.yaml \
  52. && chmod -R 755 /app/data
  53. # 安全增强配置
  54. RUN echo "hosts: files dns" > /etc/nsswitch.conf && \
  55. echo "appuser hard nofile 65535" >> /etc/security/limits.conf && \
  56. echo "appuser soft nofile 65535" >> /etc/security/limits.conf
  57. # 健康检查(使用curl代替wget)
  58. HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
  59. CMD curl -fsS http://localhost:8080/healthz || exit 1
  60. # 运行时配置
  61. USER appuser
  62. EXPOSE 8080
  63. ENTRYPOINT ["./main"]
  64. CMD ["--config", "config.yaml", "server"]