| |
| services: |
| # 数据库服务 |
| mysql: |
| image: mysql:8.0 # 建议使用具体的版本号,而不是 latest |
| container_name: mysql_db # 给容器一个易于识别的名称 |
| environment: |
| MYSQL_DATABASE: mydatabase |
| MYSQL_USER: myuser |
| MYSQL_PASSWORD: secret |
| MYSQL_ROOT_PASSWORD: verysecret |
| ports: |
| - "3306:3306" # 映射数据库端口,方便本地工具连接(可选,仅测试容器连接DB时可省略) |
| volumes: |
| - mysql-data:/var/lib/mysql # 持久化数据库数据 |
| # 添加健康检查,确保数据库服务真正可用 |
| healthcheck: |
| test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u$$MYSQL_USER", "-p$$MYSQL_PASSWORD"] |
| interval: 10s # 每 10 秒检查一次 |
| timeout: 5s # 检查超时时间 |
| retries: 5 # 重试次数 |
| start_period: 30s # 在此期间不计入重试失败次数,给数据库启动时间 |
| |
| # 应用服务(使用 Dockerfile 的 runner 阶段) |
| app: |
| build: |
| context: . # Dockerfile 所在的上下文路径 |
| dockerfile: Dockerfile # Dockerfile 文件名 |
| target: runner # 指定构建 Dockerfile 中的 runner 阶段 |
| container_name: spring_app |
| ports: |
| - "8080:8080" # 映射应用端口 |
| environment: |
| # 应用连接数据库的配置,使用数据库服务的名称作为主机名 |
| SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydatabase?serverTimezone=Asia/Shanghai&createDatabaseIfNotExist=TRUE&useSSL=FALSE&allowPublicKeyRetrieval=TRUE |
| SPRING_DATASOURCE_USERNAME: myuser |
| SPRING_DATASOURCE_PASSWORD: secret |
| # 其他 Spring Boot 配置... |
| depends_on: |
| mysql: |
| condition: service_healthy # 确保数据库服务处于健康状态才启动应用 |
| |
| |
| |
| |
| # 定义数据卷用于持久化数据库数据 |
| volumes: |
| mysql-data: |
| |