feat(docker): 添加容器化部署支持

- Dockerfile: 多阶段构建,最小化镜像体积(scratch)
- docker-compose.yml: 开发环境配置,含健康检查
- .dockerignore: 排除不必要的构建上下文

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-04-10 16:56:10 +08:00
parent 2def9817d8
commit 55c05ec41d
3 changed files with 170 additions and 0 deletions

78
.dockerignore Normal file
View File

@ -0,0 +1,78 @@
# Build artifacts
bin/
dist/
*.exe
*.exe~
*.dll
*.so
*.dylib
# Go cache and modules
vendor/
# Test artifacts
*.test
*.out
coverage.html
coverage.out
# IDE and editor
.idea/
.vscode/
*.swp
*.swo
*~
# OS generated
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Environment and secrets
.env
.env.local
.env.*.local
# Logs
*.log
logs/
# Temporary
tmp/
temp/
# Claude/OMC state
.omc/
.claude/
CLAUDE.md
# Git submodule (large)
lua-nginx-module/
# Development configs (use production configs in container)
lolly.yaml
config.yaml
# Compiled binary (will be built in container)
lolly
# Benchmark and profiling data
default.pgo
benchmark-*.txt
# Documentation (not needed in runtime)
docs/
# Scripts (not needed in runtime)
scripts/
# HTML test directory
html/
# Git
.git/
.gitignore

51
Dockerfile Normal file
View File

@ -0,0 +1,51 @@
# ---- Builder stage ----
FROM golang:1.26-alpine AS builder
WORKDIR /build
# 安装构建依赖
RUN apk add --no-cache git make
# 依赖缓存层
COPY go.mod go.sum ./
RUN go mod download
# 构建参数(版本信息)
ARG VERSION=0.2.0
ARG GIT_COMMIT=unknown
ARG GIT_BRANCH=unknown
ARG BUILD_TIME=unknown
ARG GO_VERSION=unknown
ARG BUILD_PLATFORM=linux/amd64
# 构建
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build \
-ldflags="-s -w \
-X 'rua.plus/lolly/internal/app.Version=${VERSION}' \
-X 'rua.plus/lolly/internal/app.GitCommit=${GIT_COMMIT}' \
-X 'rua.plus/lolly/internal/app.GitBranch=${GIT_BRANCH}' \
-X 'rua.plus/lolly/internal/app.BuildTime=${BUILD_TIME}' \
-X 'rua.plus/lolly/internal/app.GoVersion=${GO_VERSION}' \
-X 'rua.plus/lolly/internal/app.BuildPlatform=${BUILD_PLATFORM}'" \
-trimpath \
-o /build/lolly \
main.go
# ---- Runtime stage ----
FROM scratch
# CA 证书(出站 HTTPS 代理需要)
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
# 二进制文件
COPY --from=builder /build/lolly /lolly
# 优雅关闭SIGQUIT 触发 30s graceful stop
STOPSIGNAL SIGQUIT
# HTTP/1.1, HTTP/2, HTTP/3 (QUIC)
EXPOSE 8080/tcp 443/tcp 443/udp
ENTRYPOINT ["/lolly"]
CMD ["-c", "/etc/lolly/lolly.yaml"]

41
docker-compose.yml Normal file
View File

@ -0,0 +1,41 @@
services:
lolly:
build: .
# 防止僵尸进程lolly 无 PID 1 处理)
init: true
ports:
- "8080:8080"
# HTTP/3 (QUIC) - 需要 SSL 证书
# - "443:443/tcp"
# - "443:443/udp"
volumes:
- ./lolly.yaml:/etc/lolly/lolly.yaml:ro
# 静态文件目录
- ./html:/var/www/html:ro
# SSL 证书(可选)
# - ./certs:/etc/lolly/certs:ro
# 日志持久化(可选)
# - ./logs:/var/log/lolly
environment:
# 配合容器内存限制设置 GC 目标
- GOMEMLIMIT=750MiB
# 资源限制(可选)
# deploy:
# resources:
# limits:
# memory: 1G
# reservations:
# memory: 256M
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://localhost:8080/_status || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
# 示例后端服务(用于反向代理测试)
# backend:
# image: nginx:alpine
# ports:
# - "8000:80"