添加Docker多阶段构建和GitHub Actions自动打包推送

This commit is contained in:
Admin
2026-04-29 19:35:43 +08:00
parent 34b5c1efbb
commit 81287e19b2
5 changed files with 142 additions and 72 deletions
+22
View File
@@ -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.*
+56
View File
@@ -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
+54
View File
@@ -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"]
-47
View File
@@ -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"]
+10 -25
View File
@@ -1,5 +1,3 @@
version: '3.8'
services: services:
mysql: mysql:
image: mysql:8.0 image: mysql:8.0
@@ -7,15 +5,12 @@ services:
restart: unless-stopped restart: unless-stopped
environment: environment:
MYSQL_ROOT_PASSWORD: root123456 MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: developer_platform MYSQL_DATABASE: verification_platform
MYSQL_USER: developer
MYSQL_PASSWORD: developer123
ports: ports:
- "3306:3306" - "3306:3306"
volumes: volumes:
- mysql_data:/var/lib/mysql - mysql_data:/var/lib/mysql
- ./database/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql - ./database/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql
- ./database/seeds.sql:/docker-entrypoint-initdb.d/02-seeds.sql
networks: networks:
- developer-network - developer-network
@@ -30,45 +25,35 @@ services:
networks: networks:
- developer-network - developer-network
backend: app:
build: build:
context: ./backend context: .
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: developer-backend container_name: developer-app
restart: unless-stopped restart: unless-stopped
environment: environment:
- APP_ENV=production - APP_ENV=production
- DATABASE_HOST=mysql - DATABASE_HOST=mysql
- DATABASE_PORT=3306 - DATABASE_PORT=3306
- DATABASE_NAME=developer_platform - DATABASE_NAME=verification_platform
- DATABASE_USERNAME=developer - DATABASE_USERNAME=root
- DATABASE_PASSWORD=developer123 - DATABASE_PASSWORD=root123456
- REDIS_HOST=redis - REDIS_HOST=redis
- REDIS_PORT=6379 - REDIS_PORT=6379
ports: ports:
- "8080:8080" - "8080:8080"
volumes:
- uploads:/app/uploads
depends_on: depends_on:
- mysql - mysql
- redis - redis
networks: networks:
- developer-network - 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: volumes:
mysql_data: mysql_data:
redis_data: redis_data:
uploads:
networks: networks:
developer-network: developer-network: