添加Docker多阶段构建和GitHub Actions自动打包推送
This commit is contained in:
@@ -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.*
|
||||||
@@ -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
@@ -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"]
|
||||||
@@ -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
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user