From 81287e19b26b40855cd6784b96844bf469c215f3 Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 29 Apr 2026 19:35:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Docker=E5=A4=9A=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E6=9E=84=E5=BB=BA=E5=92=8CGitHub=20Actions=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=89=93=E5=8C=85=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 22 ++++++++++++++ .github/workflows/docker.yml | 56 ++++++++++++++++++++++++++++++++++++ Dockerfile | 54 ++++++++++++++++++++++++++++++++++ backend/Dockerfile | 47 ------------------------------ docker-compose.yml | 35 +++++++--------------- 5 files changed, 142 insertions(+), 72 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/docker.yml create mode 100644 Dockerfile delete mode 100644 backend/Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dc9be45 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,22 @@ +node_modules +dist +.git +.github +*.exe +*.dll +*.so +*.dylib +*.test +*.out +backend/verification-platform-backend.exe +backend/uploads +backend/embedded +frontend/node_modules +frontend/dist +frontend/.nuxt +frontend/.output +database +docs +README.md +.env +.env.* diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..ee6ad1a --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,56 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - main + tags: + - 'v*' + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha,prefix= + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + platforms: linux/amd64,linux/arm64 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0c64e34 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,54 @@ +FROM node:20-alpine AS frontend-builder + +WORKDIR /app/frontend + +RUN corepack enable && corepack prepare pnpm@latest --activate + +COPY frontend/package.json frontend/pnpm-lock.yaml ./ + +RUN pnpm install --frozen-lockfile + +COPY frontend/ ./ + +RUN pnpm build + +FROM golang:1.21-alpine AS backend-builder + +WORKDIR /app + +RUN apk add --no-cache git + +COPY backend/go.mod backend/go.sum ./ + +RUN go mod download + +COPY backend/ ./ + +RUN mkdir -p embedded/dist + +COPY --from=frontend-builder /app/frontend/dist ./embedded/dist/ + +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./cmd/main.go + +FROM alpine:latest + +RUN apk --no-cache add ca-certificates tzdata + +RUN addgroup -g 1001 -S appgroup && \ + adduser -u 1001 -S appuser -G appgroup + +WORKDIR /app + +COPY --from=backend-builder /app/main . +COPY --from=backend-builder /app/config.yaml . + +RUN mkdir -p /app/uploads && \ + chown -R appuser:appgroup /app + +USER appuser + +EXPOSE 8080 + +VOLUME ["/app/uploads"] + +CMD ["./main"] diff --git a/backend/Dockerfile b/backend/Dockerfile deleted file mode 100644 index c7dc11f..0000000 --- a/backend/Dockerfile +++ /dev/null @@ -1,47 +0,0 @@ -# 后端Dockerfile -FROM golang:1.21-alpine AS builder - -# 设置工作目录 -WORKDIR /app - -# 安装必要的包 -RUN apk add --no-cache git - -# 复制go mod文件 -COPY go.mod go.sum ./ - -# 下载依赖 -RUN go mod download - -# 复制源代码 -COPY . . - -# 构建应用 -RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./cmd/main.go - -# 最终镜像 -FROM alpine:latest - -# 安装ca证书 -RUN apk --no-cache add ca-certificates - -# 创建非root用户 -RUN addgroup -g 1001 -S appgroup && \ - adduser -u 1001 -S appuser -G appgroup - -WORKDIR /root/ - -# 从builder阶段复制二进制文件 -COPY --from=builder /app/main . - -# 更改文件所有者 -RUN chown appuser:appgroup main - -# 切换到非root用户 -USER appuser - -# 暴露端口 -EXPOSE 8080 - -# 启动应用 -CMD ["./main"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index d386a7a..0ef9a63 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: mysql: image: mysql:8.0 @@ -7,15 +5,12 @@ services: restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: root123456 - MYSQL_DATABASE: developer_platform - MYSQL_USER: developer - MYSQL_PASSWORD: developer123 + MYSQL_DATABASE: verification_platform ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./database/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql - - ./database/seeds.sql:/docker-entrypoint-initdb.d/02-seeds.sql networks: - developer-network @@ -30,45 +25,35 @@ services: networks: - developer-network - backend: + app: build: - context: ./backend + context: . dockerfile: Dockerfile - container_name: developer-backend + container_name: developer-app restart: unless-stopped environment: - APP_ENV=production - DATABASE_HOST=mysql - DATABASE_PORT=3306 - - DATABASE_NAME=developer_platform - - DATABASE_USERNAME=developer - - DATABASE_PASSWORD=developer123 + - DATABASE_NAME=verification_platform + - DATABASE_USERNAME=root + - DATABASE_PASSWORD=root123456 - REDIS_HOST=redis - REDIS_PORT=6379 ports: - "8080:8080" + volumes: + - uploads:/app/uploads depends_on: - mysql - redis networks: - developer-network - frontend: - build: - context: ./frontend - dockerfile: Dockerfile - container_name: developer-frontend - restart: unless-stopped - ports: - - "80:80" - depends_on: - - backend - networks: - - developer-network - volumes: mysql_data: redis_data: + uploads: networks: developer-network: