Ver Fonte

dockerfile修复

wuzj há 2 meses atrás
pai
commit
d8380d493a
1 ficheiros alterados com 50 adições e 47 exclusões
  1. 50 47
      Dockerfile

+ 50 - 47
Dockerfile

@@ -1,76 +1,79 @@
-# 构建阶段(使用新版官方镜像)
-FROM golang:1.21-alpine3.19 AS builder
-
-# 设置工作目录
-WORKDIR /app
-
-# 配置Alpine镜像源(使用新版)
-RUN echo -e "https://mirrors.aliyun.com/alpine/v3.19/main\nhttps://mirrors.aliyun.com/alpine/v3.19/community" > /etc/apk/repositories
-
-# 安装构建依赖(添加upgrade确保索引最新)
-RUN apk add --no-cache --upgrade \
-    gcc \
-    g++ \
-    musl-dev \
-    sqlite-dev \
-    make
+# 构建阶段(使用Debian基础镜像保证glibc兼容性)
+FROM golang:1.21-bullseye AS builder
 
 # 配置Go环境
 ENV GOPROXY=https://goproxy.cn,direct \
     CGO_ENABLED=1 \
     GOOS=linux \
-    GOARCH=amd64
+    GOARCH=amd64 \
+    GO111MODULE=on
+
+# 安装构建依赖
+RUN apt-get update && apt-get install -y \
+    gcc \
+    g++ \
+    libsqlite3-dev \
+    pkg-config \
+    && rm -rf /var/lib/apt/lists/*
 
-# 复制依赖文件先进行缓存
+WORKDIR /app
+
+# 复制依赖清单
 COPY go.mod go.sum ./
 RUN go mod download
 
-# 复制项目代码
+# 复制代码
 COPY . .
 
-# 构建可执行文件(添加-ldflags优化)
-RUN go build -ldflags="-w -s" -o /app/main cmd/main.go
+# 构建优化参数
+RUN go build -v -ldflags="-w -s -linkmode external -extldflags '-static'" \
+    -tags "osusergo netgo sqlite_omit_load_extension" \
+    -o /app/main cmd/main.go
 
 # 运行时阶段
-FROM alpine:3.19
-
-# 配置镜像源和基础依赖
-RUN echo -e "https://mirrors.aliyun.com/alpine/v3.19/main\nhttps://mirrors.aliyun.com/alpine/v3.19/community" > /etc/apk/repositories \
-    && apk update \
-    && apk add --no-cache --upgrade \
-    sqlite-libs \
-    libc6-compat \
-    ca-certificates \
-    tzdata
+FROM debian:bullseye-slim
 
 # 设置容器时区
 ENV TZ=Asia/Shanghai
+RUN apt-get update && apt-get install -y \
+    ca-certificates \
+    tzdata \
+    libsqlite3-0 \
+    curl \
+    && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
+    && echo $TZ > /etc/timezone \
+    && rm -rf /var/lib/apt/lists/*
 
-# 创建专用用户
-RUN addgroup -S appgroup && adduser -S appuser -G appgroup
+# 创建专用用户(固定uid/gid)
+RUN groupadd -g 10001 appgroup && \
+    useradd -u 10001 -g appgroup -d /app -s /sbin/nologin appuser
 
-# 设置工作目录并转移所有权
+# 设置工作目录
 WORKDIR /app
-RUN mkdir -p /app/data/json_files
+
+# 从构建阶段复制文件
 COPY --from=builder --chown=appuser:appgroup /app/main .
 COPY --chown=appuser:appgroup config.yaml .
-COPY --chown=appuser:appgroup data/json_files ./data/json_files
+COPY --chown=appuser:appgroup --from=builder /app/data/json_files ./data/json_files
 
-# 设置权限
-RUN chmod 755 /app/main \
+# 初始化容器环境
+RUN mkdir -p /app/data \
+    && chown -R appuser:appgroup /app \
+    && chmod 755 /app/main \
     && chmod 644 config.yaml \
     && chmod -R 755 /app/data
 
-# 切换到非root用户
-USER appuser
+# 安全增强配置
+RUN echo "hosts: files dns" > /etc/nsswitch.conf && \
+    echo "appuser hard nofile 65535" >> /etc/security/limits.conf && \
+    echo "appuser soft nofile 65535" >> /etc/security/limits.conf
 
-# 健康检查
-HEALTHCHECK --interval=30s --timeout=3s \
-    CMD wget --spider http://localhost:8080/healthz || exit 1
+# 健康检查(使用curl代替wget)
+HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
+    CMD curl -fsS http://localhost:8080/healthz || exit 1
 
-# 暴露端口
+# 运行时配置
+USER appuser
 EXPOSE 8080
-
-# 启动命令
 ENTRYPOINT ["./main"]
-CMD ["server"]
+CMD ["--config", "config.yaml", "server"]