主要改动: - Docker Compose 配置优化: * 为所有环境的 MySQL 服务添加 stop_grace_period: 60s(增加优雅关闭时间) * 添加 stop_signal: SIGTERM(使用 SIGTERM 信号优雅停止) * 添加 init: true(使用 init 进程管理子进程,避免僵尸进程) - Makefile 改进: * 所有 docker-down-* 命令添加自动重试机制 * 自动检测权限错误并重启 rootless Docker 服务 * 显示完整的 Docker Compose 进度信息(包括容器状态变化) - README.md 更新: * 添加 Docker 权限问题的详细解决方案 * 包括 rootless Docker 的特殊处理方法和自动重试机制说明 问题原因: MySQL 容器在 rootless Docker 环境下停止时遇到权限问题,需要更长的优雅关闭时间来处理 InnoDB 数据文件。 解决方案: 1. 增加 stop_grace_period 到 60 秒,给 MySQL 足够时间优雅关闭 2. 使用 init 进程管理子进程,避免权限问题 3. 在 Makefile 中添加自动检测和重试机制,无需手动重启 Docker 服务
72 lines
1.5 KiB
YAML
72 lines
1.5 KiB
YAML
services:
|
|
yinli-api:
|
|
build:
|
|
context: ..
|
|
dockerfile: Dockerfile
|
|
ports:
|
|
- "1234:1234"
|
|
environment:
|
|
- APP_ENV=prod
|
|
depends_on:
|
|
- mysql
|
|
- redis
|
|
volumes:
|
|
- ../config:/app/config:ro
|
|
networks:
|
|
- yinli-network
|
|
restart: always
|
|
healthcheck:
|
|
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:1234/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 40s
|
|
|
|
mysql:
|
|
image: mysql:8.0
|
|
environment:
|
|
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
|
MYSQL_DATABASE: yinli
|
|
ports:
|
|
- "3308:3306"
|
|
volumes:
|
|
- mysql_prod_data:/var/lib/mysql
|
|
- ../sql:/docker-entrypoint-initdb.d:ro
|
|
networks:
|
|
- yinli-network
|
|
restart: always
|
|
stop_grace_period: 60s
|
|
stop_signal: SIGTERM
|
|
init: true
|
|
command: --default-authentication-plugin=mysql_native_password
|
|
healthcheck:
|
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
|
|
redis:
|
|
image: redis:7-alpine
|
|
ports:
|
|
- "6381:6379"
|
|
volumes:
|
|
- redis_prod_data:/data
|
|
networks:
|
|
- yinli-network
|
|
restart: always
|
|
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-}
|
|
healthcheck:
|
|
test: ["CMD", "redis-cli", "ping"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
|
|
volumes:
|
|
mysql_prod_data:
|
|
redis_prod_data:
|
|
|
|
networks:
|
|
yinli-network:
|
|
driver: bridge
|
|
|