Docker Compose中如何在Oracle数据库初始化后启动Java Spring应用?
解决Oracle初始化完成后启动Spring应用的问题
默认的depends_on只会等待Oracle容器启动,不会等待数据库初始化(包括你挂载的SQL脚本执行)完成,这就是你遇到问题的核心原因。要实现等待初始化完成再启动应用,需要给Oracle服务配置健康检查,并让应用服务依赖Oracle的健康状态。
修改后的Docker Compose配置
version: '3.4' services: oracle-xe: image: preloaded_db:latest container_name: oracle ports: - "1521:1521" environment: - ORACLE_PASSWORD=oracle healthcheck: test: ["CMD-SHELL", "sqlplus -s system/oracle@//localhost:1521/XE <<< 'SELECT 1 FROM DUAL;'"] interval: 10s timeout: 5s retries: 30 start_period: 60s app: build: context: ./app dockerfile: Dockerfile ports: - "8080:8080" depends_on: oracle-xe: condition: service_healthy
配置说明
healthcheck:通过
sqlplus执行简单查询验证数据库是否就绪:test:使用sqlplus连接system用户,执行SELECT 1 FROM DUAL,执行成功则说明数据库已完成初始化并可正常连接interval:每10秒执行一次健康检查timeout:单次检查超时时间设为5秒retries:最多重试30次,总等待时长可覆盖Oracle初始化的常规耗时start_period:容器启动后60秒再开始检查,给Oracle足够的基础服务启动时间
depends_on的condition:指定
service_healthy,只有当Oracle服务的健康检查通过后,才会启动Spring应用容器
额外注意事项
- 确认自定义Oracle镜像中
/docker-entrypoint-initdb.d/下的SQL脚本被正确执行:gvenzl/oracle-xe镜像会在首次启动时自动执行该目录下的脚本,执行完成后才会完成数据库初始化流程 - 如果你的初始化脚本执行时间较长,可以适当调大
start_period或retries的值,避免健康检查过早判定失败
内容的提问来源于stack exchange,提问作者tony_rosey
相关产品推荐
相关产品推荐

