# 芋道 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: