94 lines
3.2 KiB
Docker
94 lines
3.2 KiB
Docker
# Use build arguments for Go version and architecture
|
|
ARG GO_VERSION=1.22
|
|
ARG BUILDARCH=amd64
|
|
|
|
# Stage 1: Builder Stage
|
|
# FROM golang:${GO_VERSION}-alpine AS builder
|
|
FROM crazymax/xgo:${GO_VERSION} AS builder-backend
|
|
|
|
# Set up working directory
|
|
WORKDIR /app
|
|
|
|
# Step 1: Copy the source code
|
|
COPY . .
|
|
|
|
# use --mount=type=cache,target=/go/pkg/mod to cache the go mod
|
|
# Step 2: Download dependencies
|
|
RUN --mount=type=cache,target=/go/pkg/mod \
|
|
go mod tidy && go mod download && go install github.com/swaggo/swag/cmd/swag@latest
|
|
|
|
# Step 3: Run swag build script
|
|
RUN --mount=type=cache,target=/go/pkg/mod \
|
|
swag init -g cmd/apimain.go --output docs/api --instanceName api --exclude http/controller/admin && \
|
|
swag init -g cmd/apimain.go --output docs/admin --instanceName admin --exclude http/controller/api
|
|
|
|
# Step 4: Build the Go application with CGO enabled and specified ldflags
|
|
RUN --mount=type=cache,target=/go/pkg/mod \
|
|
CGO_ENABLED=1 GOOS=linux go build -a \
|
|
-ldflags "-s -w --extldflags '-static -fpic'" \
|
|
-installsuffix cgo -o release/apimain cmd/apimain.go
|
|
|
|
# Stage 2: Frontend Build Stage (builder2)
|
|
FROM node:18-alpine AS builder-admin-frontend
|
|
|
|
# Set working directory
|
|
WORKDIR /frontend
|
|
|
|
ARG COUNTRY
|
|
# Install required tools without caching index to minimize image size
|
|
RUN if [ "$COUNTRY" = "CN" ] ; then \
|
|
echo "It is in China, updating the repositories"; \
|
|
sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories; \
|
|
fi && \
|
|
apk update && apk add --no-cache git
|
|
|
|
ARG FREONTEND_GIT_REPO=https://github.com/lejianwen/rustdesk-api-web.git
|
|
ARG FRONTEND_GIT_BRANCH=master
|
|
# Clone the frontend repository
|
|
|
|
RUN git clone -b $FRONTEND_GIT_BRANCH $FREONTEND_GIT_REPO .
|
|
|
|
# Install required tools without caching index to minimize image size
|
|
RUN if [ "$COUNTRY" = "CN" ] ; then \
|
|
echo "It is in China, updating NPM_CONFIG_REGISTRY"; \
|
|
export NPM_CONFIG_REGISTRY="https://mirrors.huaweicloud.com/repository/npm/"; \
|
|
fi && \
|
|
npm install && npm run build
|
|
|
|
|
|
# Stage 2: Final Image
|
|
FROM alpine:latest
|
|
|
|
# Set up working directory
|
|
WORKDIR /app
|
|
|
|
# Install necessary runtime dependencies
|
|
# Install required tools without caching index to minimize image size
|
|
ARG COUNTRY
|
|
RUN if [ "$COUNTRY" = "CN" ] ; then \
|
|
echo "It is in China, updating the repositories"; \
|
|
sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories; \
|
|
fi && \
|
|
apk update && apk add --no-cache tzdata file
|
|
|
|
# Copy the built application and resources from the builder stage
|
|
COPY --from=builder-backend /app/release /app/
|
|
COPY --from=builder-backend /app/conf /app/conf/
|
|
COPY --from=builder-backend /app/resources /app/resources/
|
|
COPY --from=builder-backend /app/docs /app/docs/
|
|
# Copy frontend build from builder2 stage
|
|
COPY --from=builder-admin-frontend /frontend/dist/ /app/resources/admin/
|
|
|
|
# Ensure the binary is correctly built and linked
|
|
RUN file /app/apimain && \
|
|
mkdir -p /app/data && \
|
|
mkdir -p /app/runtime
|
|
|
|
# Set up a volume for persistent data
|
|
VOLUME /app/data
|
|
|
|
# Expose the necessary port
|
|
EXPOSE 21114
|
|
|
|
# Define the command to run the application
|
|
CMD ["./apimain"] |