# 开发环境容器编排 # 启动(在项目根目录执行;Compose 会自动加载同目录的 docker/.env): # docker compose -f docker/docker-compose.dev.yml up -d # # name 显式指定 Compose 项目名。不指定时会取 compose 文件所在目录名(即 docker), # 导致网络/卷被命名为 docker_default、docker_mysql-dev-data 这类无意义名称。 name: ys-payroll services: mysql: image: mysql:8.0 container_name: ys-mysql-dev restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} # 应用连接用专用账号,避免后端以 root 身份连库 MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} TZ: Asia/Shanghai command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci volumes: - mysql-dev-data:/var/lib/mysql # 首次启动自动执行 db/init 下的初始化脚本 - ../db/init:/docker-entrypoint-initdb.d ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"] interval: 10s timeout: 5s retries: 10 start_period: 30s redis: image: redis:7-alpine container_name: ys-redis-dev restart: unless-stopped environment: TZ: Asia/Shanghai # 健康检查脚本在容器内展开(密码不进宿主进程命令行,模式同 mysql) REDIS_PASSWORD: ${REDIS_PASSWORD} # appendonly 开启 AOF,容器重启后验证码黑名单等数据不丢 command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD} volumes: - redis-dev-data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "--no-auth-warning", "ping"] interval: 10s timeout: 5s retries: 10 volumes: mysql-dev-data: redis-dev-data: