# 以下由「部署管理器」根据项目配置在保存时自动生成/更新 # 根据「构建命令」解析编译目标;可在项目表单中修改 buildCmd # 打入镜像的目录 / 单文件 / 构建期必需文件:由 docker-compose build.args 或 docker build --build-arg 配置(见部署管理器「镜像打包」) FROM golang:1.25 AS builder ARG DOCKER_BUNDLE_PATHS=certs ARG DOCKER_BUNDLE_REQUIRED_FILES= ARG DOCKER_BUNDLE_FILES= # 构建容器内常无法访问 proxy.golang.org;默认 goproxy.cn,可用 --build-arg GOPROXY= 覆盖 ARG GOPROXY=https://goproxy.cn,direct ENV GOPROXY=${GOPROXY} WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY . . ARG DOCKER_BUNDLE_PATHS ARG DOCKER_BUNDLE_REQUIRED_FILES ARG DOCKER_BUNDLE_FILES RUN set -e; mkdir -p /bundle-out; \ if [ -n "$DOCKER_BUNDLE_REQUIRED_FILES" ]; then \ rem="$DOCKER_BUNDLE_REQUIRED_FILES"; \ while [ -n "$rem" ]; do \ case "$rem" in \ *:*) f="${rem%%:*}"; rem="${rem#*:}";; \ *) f="$rem"; rem="";; \ esac; \ [ -z "$f" ] && continue; \ case "$f" in *..*|/*) echo "illegal required file: $f" >&2; exit 1;; esac; \ test -f "/src/$f" || (echo "missing required file: $f" >&2; exit 1); \ done; \ fi; \ if [ -n "$DOCKER_BUNDLE_PATHS" ]; then \ for d in $DOCKER_BUNDLE_PATHS; do \ [ -z "$d" ] && continue; \ case "$d" in *..*|/*) echo "illegal bundle dir: $d" >&2; exit 1;; esac; \ test -d "/src/$d" || (echo "missing bundle dir: $d" >&2; exit 1); \ mkdir -p "/bundle-out/$d" && cp -a "/src/$d/." "/bundle-out/$d/"; \ done; \ fi; \ if [ -n "$DOCKER_BUNDLE_FILES" ]; then \ rem="$DOCKER_BUNDLE_FILES"; \ while [ -n "$rem" ]; do \ case "$rem" in \ *:*) f="${rem%%:*}"; rem="${rem#*:}";; \ *) f="$rem"; rem="";; \ esac; \ [ -z "$f" ] && continue; \ case "$f" in *..*|/*) echo "illegal bundle file: $f" >&2; exit 1;; esac; \ test -f "/src/$f" || (echo "missing bundle file: $f" >&2; exit 1); \ df="$(dirname "$f")"; \ mkdir -p "/bundle-out/$df"; \ cp "/src/$f" "/bundle-out/$f"; \ done; \ fi; \ touch /bundle-out/.bundle-stamp RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags="-s -w" -o /out/soul-api ./cmd/server FROM alpine:3.19 WORKDIR /app RUN apk add --no-cache ca-certificates tzdata wget && \ addgroup -S app && adduser -S -G app app COPY --from=builder /out/soul-api /app/soul-api COPY --from=builder /bundle-out/ /app/ RUN rm -f /app/.bundle-stamp RUN mkdir -p /app/uploads /app/log && chown -R app:app /app ENV APP_ENV=production ENV GIN_MODE=release ENV PORT=8080 ENV UPLOAD_DIR=/app/uploads EXPOSE 8080 USER app CMD ["/app/soul-api"]