Files
FileShare/deploy/Dockerfile
T
SKYMirror f050944866
Release 镜像 / 测试(推送前置门禁) (push) Successful in 38s
Release 镜像 / 多架构构建并推送 ACR (push) Failing after 0s
CI:基础镜像改走 ACR 私有镜像(runner 网络 docker.io DNS 污染,直连不可达);APK/NPM 全部国内源;Dockerfile 基础镜像参数化
2026-09-05 07:43:40 +08:00

57 lines
2.5 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 文件快传 Go 版多阶段构建:
# 1) node:20-alpine 构建 Vue 前端产物(web/dist
# 2) golang:1.27.1-alpine 编译 servergo:embed 前端产物,缓存指向 /tmp 避免写权限问题)
# 3) 最小运行时镜像:server 二进制 + web/dist 静态产物
# 基础镜像可通过 build-arg 覆盖:CI/受限网络下指向 ACR 命名空间镜像
# --build-arg NODE_IMAGE=… GO_IMAGE=… RUNTIME_IMAGE=… APK_MIRROR=mirrors.aliyun.com
ARG NODE_IMAGE=node:20-alpine
ARG GO_IMAGE=golang:1.27.1-alpine
ARG RUNTIME_IMAGE=alpine:3.20
# NPM_REGISTRYCI/受限网络下注入 npm 镜像源(默认官方源)
ARG NPM_REGISTRY=https://registry.npmjs.org
FROM ${NODE_IMAGE} AS frontend
ARG NPM_REGISTRY
WORKDIR /build
RUN npm config set registry "$NPM_REGISTRY"
COPY web/package.json web/package-lock.json* ./
RUN npm ci || npm install
COPY web/ ./
RUN npm run build
FROM ${GO_IMAGE} AS backend
WORKDIR /build
# GOPROXY:默认走 goproxy.cnproxy.golang.org 的 GCS 后端在本环境网络下 EOF/超时),direct 兜底
ENV CGO_ENABLED=0 GOSUMDB=off GOPROXY=https://goproxy.cn,direct GOCACHE=/tmp/.gocache GOMODCACHE=/tmp/.gomodcache
# 先拷贝 go.mod/go.sum 利用层缓存
COPY server/go.mod server/go.sum ./
RUN go mod download
COPY server/ ./
# 前端产物嵌入(go:embed 目标目录 server/web/dist):
# 优先用宿主预构建产物 web-embed/(构建前由 `cp -a web/dist web-embed/` 维护,
# 保证 embed 与前端最新修正一致);为空/缺失时回退跨阶段 COPY(CI 兜底)
COPY --from=frontend /build/dist ./frontend-dist
COPY web-embed/ ./web-embed/
RUN if [ -f web-embed/index.html ]; then \
rm -rf web/dist && cp -a web-embed/. web/dist/; \
else \
rm -rf web/dist && cp -a frontend-dist/. web/dist/; \
fi \
&& rm -rf web-embed frontend-dist
RUN go build -trimpath -ldflags "-s -w" -o /out/server ./cmd/server
FROM ${RUNTIME_IMAGE}
# APK_MIRROR:受限网络下注入 alpine 镜像源(空=默认源)
ARG APK_MIRROR=""
RUN if [ -n "$APK_MIRROR" ]; then sed -i "s|https://dl-cdn.alpinelinux.org|$APK_MIRROR|g" /etc/apk/repositories; fi \
&& apk add --no-cache ca-certificates tzdata curl && adduser -D -u 10001 fcb
WORKDIR /app
COPY --from=backend /out/server /app/server
# dist 随镜像分发(服务端已 go:embed,磁盘副本供运维检查/替换)
COPY --from=backend /build/web/dist /app/web/dist
RUN mkdir -p /app/data && chown -R fcb:fcb /app
USER fcb
ENV FCB_LISTEN=:8466
EXPOSE 8466
VOLUME ["/app/data"]
ENTRYPOINT ["/app/server"]