docker-compose.yml 4.74 KB
# 芋道 Boot 单体版 Docker Compose 入门部署:yudao-server + 前端 Nginx + MySQL + Redis
# 使用说明见同目录 README.md;需 Docker Compose V2.20.2 及以上(docker compose 命令)
# 本文件中的相对路径,均相对于本文件所在目录,与执行命令时的当前目录无关

name: yudao-boot

services:
  mysql:
    image: mysql:8.4
    restart: unless-stopped
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    environment:
      TZ: Asia/Shanghai
      MYSQL_DATABASE: ${MYSQL_DATABASE:-ruoyi-vue-pro}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?请在 .env 中设置 MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER:-yudao}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:?请在 .env 中设置 MYSQL_PASSWORD}
    volumes:
      - mysql-data:/var/lib/mysql
      # 仅在 mysql-data 卷为空(首次启动)时,按文件名顺序执行;SQL 文件不存在时直接报错,避免被创建成空目录
      - type: bind
        source: ../../sql/mysql/ruoyi-vue-pro.sql
        target: /docker-entrypoint-initdb.d/01-ruoyi-vue-pro.sql
        read_only: true
        bind:
          create_host_path: false
      - type: bind
        source: ../../sql/mysql/quartz.sql
        target: /docker-entrypoint-initdb.d/02-quartz.sql
        read_only: true
        bind:
          create_host_path: false
    # 默认不对宿主机开放;需要本机客户端连接时,取消注释(避免与本机已有 3306 冲突)
    # ports:
    #   - "127.0.0.1:13306:3306"
    healthcheck:
      # 首次初始化时 MySQL 临时实例不监听 TCP,因此 127.0.0.1 可连通即表示初始化完成
      test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u root -p\"$$MYSQL_ROOT_PASSWORD\" --silent"]
      interval: 10s
      timeout: 5s
      retries: 30
      start_period: 60s

  redis:
    image: redis:7.4-alpine
    restart: unless-stopped
    command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD:?请在 .env 中设置 REDIS_PASSWORD}"]
    environment:
      REDISCLI_AUTH: ${REDIS_PASSWORD}
    volumes:
      - redis-data:/data
    # 默认不对宿主机开放;需要时取消注释(避免与本机已有 6379 冲突)
    # ports:
    #   - "127.0.0.1:16379:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 10

  yudao-server:
    # 使用模块自带的 Dockerfile,需先在源码根目录执行 mvn 打包,生成 yudao-server/target/yudao-server.jar
    build:
      context: ../../yudao-server
    image: yudao-server:${IMAGE_TAG:-local}
    restart: unless-stopped
    environment:
      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
      JAVA_OPTS: ${JAVA_OPTS:--Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom}
      # 数据库:主库、从库都要覆盖,否则会使用 application-${SPRING_PROFILES_ACTIVE}.yaml 中的 127.0.0.1
      SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://mysql:3306/${MYSQL_DATABASE:-ruoyi-vue-pro}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
      SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: ${MYSQL_USER:-yudao}
      SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: ${MYSQL_PASSWORD}
      SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_URL: jdbc:mysql://mysql:3306/${MYSQL_DATABASE:-ruoyi-vue-pro}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
      SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_USERNAME: ${MYSQL_USER:-yudao}
      SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_PASSWORD: ${MYSQL_PASSWORD}
      # Redis:Spring Boot 3.x 使用 spring.data.redis.*
      SPRING_DATA_REDIS_HOST: redis
      SPRING_DATA_REDIS_PORT: 6379
      SPRING_DATA_REDIS_PASSWORD: ${REDIS_PASSWORD}
      # 需与前端打包时的 VITE_APP_CAPTCHA_ENABLE 一致
      YUDAO_CAPTCHA_ENABLE: ${YUDAO_CAPTCHA_ENABLE:-true}
      YUDAO_DEMO: "false"
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
    # 默认只通过 web 的 Nginx 访问;需要直连后端排查时,取消注释
    # ports:
    #   - "127.0.0.1:48080:48080"

  web:
    image: nginx:1.28-alpine
    restart: unless-stopped
    ports:
      - "${WEB_PORT:-8080}:80"
    volumes:
      # 前端打包产物(包含 index.html 的目录内容)复制到 ./web/dist
      - type: bind
        source: ./web/dist
        target: /usr/share/nginx/html
        read_only: true
        bind:
          create_host_path: false
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - yudao-server

volumes:
  mysql-data:
  redis-data: