Docker Compose依赖失效:Docker容器自动化部署Drupal遇问题
解决Docker Compose中Drupal依赖MariaDB启动的问题
你遇到的depends_on看似不生效的问题,其实是Docker Compose的一个常见“坑”——depends_on仅能保证容器的启动顺序,它并不会等待MariaDB的数据库服务完全初始化就绪,就会启动Drupal容器。这时候Drupal尝试连接数据库时,MariaDB容器虽然已经启动,但数据库进程还没准备好,自然会连接失败。
我给你几个实用的解决方案,你可以根据自己的需求选择:
方案一:用wait-for-it脚本等待数据库端口就绪
这是最常用的轻量解决方案,核心是让Drupal容器先等待MariaDB的3306端口开放,确认服务可用后再启动自身服务。
- 先修改
drupal_init/Dockerfile,添加wait-for-it脚本:
FROM drupal RUN apt-get update -y && apt-get install -y wget vim git mysql-client # 下载并配置wait-for-it脚本 RUN wget -O /usr/local/bin/wait-for-it https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh RUN chmod +x /usr/local/bin/wait-for-it
- 然后更新你的
docker-compose.yml,给Drupal服务添加启动命令:
version: '2' services: mariadb: image: mariadb environment: MYSQL_DATABASE: drupal8 MYSQL_USER: drupal8 MYSQL_PASSWORD: drupal8 MYSQL_ROOT_PASSWORD: drupal8 restart: always drupal: image: drupal build: drupal_init ports: - 8888:80 depends_on: - mariadb # 先等待mariadb的3306端口就绪,再启动apache服务 command: ["/usr/local/bin/wait-for-it", "mariadb:3306", "--", "apache2-foreground"]
方案二:利用健康检查(需升级到Compose 3+)
如果你能把docker-compose.yml的版本升级到3.8及以上,可以用Docker的健康检查功能,让Drupal只在MariaDB服务完全健康后再启动:
version: '3.8' services: mariadb: image: mariadb environment: MYSQL_DATABASE: drupal8 MYSQL_USER: drupal8 MYSQL_PASSWORD: drupal8 MYSQL_ROOT_PASSWORD: drupal8 restart: always # 添加健康检查,确认数据库能正常响应 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pdrupal8"] interval: 5s # 每5秒检查一次 timeout: 5s # 超时时间5秒 retries: 5 # 最多重试5次 drupal: image: drupal build: drupal_init ports: - 8888:80 depends_on: mariadb: condition: service_healthy # 仅当mariadb服务健康时才启动
方案三:自定义启动脚本实现连接重试
如果不想依赖外部脚本,也可以写一个简单的shell脚本,让Drupal循环尝试连接数据库,直到成功再启动服务:
- 在
drupal_init目录下创建start.sh脚本:
#!/bin/bash # 循环尝试连接数据库,直到成功 until mysql -h mariadb -u drupal8 -pdrupal8 -e "SELECT 1"; do echo "MariaDB还未就绪,等待2秒后重试..." sleep 2 done # 数据库就绪,启动Apache服务 apache2-foreground
- 修改
drupal_init/Dockerfile,复制并配置这个脚本:
FROM drupal RUN apt-get update -y && apt-get install -y wget vim git mysql-client # 复制自定义启动脚本 COPY start.sh /usr/local/bin/start.sh RUN chmod +x /usr/local/bin/start.sh # 设置启动命令为自定义脚本 CMD ["/usr/local/bin/start.sh"]
最后提醒你几个注意点:
- 如果你坚持用Compose v2,方案二的
service_healthy条件不支持,优先选方案一或三。 - Drupal连接数据库时,主机名要填
mariadb(也就是docker-compose里的服务名),Docker会自动解析这个名称到对应的容器IP。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

