You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose依赖失效:Docker容器自动化部署Drupal遇问题

解决Docker Compose中Drupal依赖MariaDB启动的问题

你遇到的depends_on看似不生效的问题,其实是Docker Compose的一个常见“坑”——depends_on仅能保证容器的启动顺序,它并不会等待MariaDB的数据库服务完全初始化就绪,就会启动Drupal容器。这时候Drupal尝试连接数据库时,MariaDB容器虽然已经启动,但数据库进程还没准备好,自然会连接失败。

我给你几个实用的解决方案,你可以根据自己的需求选择:

方案一:用wait-for-it脚本等待数据库端口就绪

这是最常用的轻量解决方案,核心是让Drupal容器先等待MariaDB的3306端口开放,确认服务可用后再启动自身服务。

  1. 先修改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
  1. 然后更新你的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循环尝试连接数据库,直到成功再启动服务:

  1. 在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
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:30:30