mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-08-11 15:43:52 +08:00
99 lines
2.5 KiB
Docker
99 lines
2.5 KiB
Docker
# BackupX 多阶段构建
|
||
#
|
||
# 用法:
|
||
# 国际构建(默认):docker build -t backupx .
|
||
# 国内加速构建: docker build --build-arg USE_CHINA_MIRROR=true -t backupx .
|
||
# 注入版本号: docker build --build-arg VERSION=v1.2.3 -t backupx .
|
||
|
||
# 全局构建参数
|
||
ARG USE_CHINA_MIRROR=false
|
||
|
||
|
||
# ---- Stage 1: Build frontend ----
|
||
FROM node:24-alpine AS web-builder
|
||
ARG USE_CHINA_MIRROR
|
||
|
||
# 国内镜像:npm 使用淘宝源
|
||
RUN if [ "$USE_CHINA_MIRROR" = "true" ]; then \
|
||
npm config set registry https://registry.npmmirror.com; \
|
||
fi
|
||
|
||
WORKDIR /build/web
|
||
COPY web/package.json web/package-lock.json ./
|
||
RUN npm ci
|
||
COPY web/ ./
|
||
RUN npm run build
|
||
|
||
|
||
# ---- Stage 2: Build backend ----
|
||
FROM golang:1.25-alpine AS server-builder
|
||
ARG USE_CHINA_MIRROR
|
||
ARG VERSION=dev
|
||
|
||
# 国内镜像:Go 模块使用七牛代理
|
||
RUN if [ "$USE_CHINA_MIRROR" = "true" ]; then \
|
||
go env -w GOPROXY=https://goproxy.cn,direct; \
|
||
fi
|
||
|
||
WORKDIR /build/server
|
||
COPY server/go.mod server/go.sum ./
|
||
RUN go mod download
|
||
COPY server/ ./
|
||
RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w -X main.version=${VERSION}" -o backupx ./cmd/backupx
|
||
|
||
|
||
# ---- Stage 3: Production image ----
|
||
FROM alpine:3.21
|
||
ARG USE_CHINA_MIRROR
|
||
|
||
# 国内镜像:Alpine apk 使用阿里云源
|
||
RUN if [ "$USE_CHINA_MIRROR" = "true" ]; then \
|
||
sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories; \
|
||
fi
|
||
|
||
# Database client binaries are required by MySQL and PostgreSQL backup tasks.
|
||
RUN apk add --no-cache \
|
||
tzdata \
|
||
ca-certificates \
|
||
su-exec \
|
||
mysql-client \
|
||
postgresql16-client \
|
||
&& rm -rf /var/cache/apk/*
|
||
|
||
# Create app user
|
||
RUN addgroup -S backupx && adduser -S -G backupx -h /app backupx
|
||
|
||
# Copy backend binary
|
||
COPY --from=server-builder /build/server/backupx /app/bin/backupx
|
||
|
||
# Copy frontend static files
|
||
COPY --from=web-builder /build/web/dist /app/web
|
||
|
||
# Copy entrypoint
|
||
COPY deploy/docker/entrypoint.sh /app/entrypoint.sh
|
||
RUN chmod +x /app/entrypoint.sh
|
||
|
||
# Create data directories
|
||
RUN mkdir -p /app/data /tmp/backupx && \
|
||
touch /app/data/.backupx-owner-v2 && \
|
||
chown -R backupx:backupx /app/data /tmp/backupx && \
|
||
chmod 0750 /app/data /tmp/backupx
|
||
|
||
WORKDIR /app
|
||
EXPOSE 8340
|
||
|
||
VOLUME ["/app/data"]
|
||
|
||
ENV BACKUPX_SERVER_HOST=0.0.0.0 \
|
||
BACKUPX_SERVER_PORT=8340 \
|
||
BACKUPX_SERVER_WEB_ROOT=/app/web
|
||
|
||
USER root
|
||
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
||
CMD su-exec backupx:backupx wget -q -T 3 -O /dev/null http://127.0.0.1:8340/ready || exit 1
|
||
|
||
STOPSIGNAL SIGTERM
|
||
|
||
ENTRYPOINT ["/app/entrypoint.sh"]
|