【问题标题】:Docker-compose Laravel how to wait for the database to load?Docker-compose Laravel 如何等待数据库加载?
【发布时间】:2020-01-12 17:36:52
【问题描述】:

我正在尝试为我的 Laravel 应用程序设置测试。
该应用程序使用 Docker compose 运行。

当我尝试使用此命令开始测试时:

docker-compose -p tests --env-file .env_tests --rm run myapp ./vendor/bin/phpunit

测试在数据库容器准备好之前开始运行。
如何让我的测试等待数据库准备就绪?

我的docker-compose.yml 看起来像这样:

version: '2'

services:
  mariadb:
    image: 'bitnami/mariadb:10.1'
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - MARIADB_USER=my_user
      - MARIADB_DATABASE=my_database
      - MARIADB_PASSWORD=my_password
    ports:
      # connect your dbeaver/workbench to localhost:${WORKBENCH_PORT}
      - ${WORKBENCH_PORT}:3306
    # volumes:
      # Do not load databases here, as there is no
      # good way for other containers to wait for this to finish
      # - ./database:/docker-entrypoint-initdb.d
  myapp:
    tty: true
    image: bitnami/laravel:6-debian-9
    environment:
      - DB_HOST=mariadb
      - DB_USERNAME=my_user
      - DB_DATABASE=my_database
      - DB_PASSWORD=my_password
    depends_on:
      - mariadb
    ports:
      - 3000:3000
    volumes:
      - ./:/app

当我正常启动应用程序时(docker-compose up),Laravel 等待 mariadb 容器完成加载,但我不知道这是如何完成的。

---- 编辑 ----
我发现我使用的 bitami/laravel Docker 容器有一个名为 wait_for_db() 的脚本,它似乎在等待数据库。
我还没有发现为什么这个脚本在正常模式下运行,但在我开始测试时却没有。

【问题讨论】:

    标签: laravel docker-compose mariadb


    【解决方案1】:

    根据official docs,不可能等到数据库准备好,而只能等到它已经启动:

    但是,对于启动,Compose 不会等到容器“准备好”(无论这对您的特定应用程序意味着什么)——只等到它运行。这是有充分理由的。 (...) 最好的解决方案是在您的应用程序代码中执行此检查,无论是在启动时还是因任何原因失去连接时。

    一般情况和测试用例之间的应用行为差异可能与其他原因有关,例如测试加载时间较短(给数据库准备的时间较短)或测试处理连接失败一种不同的方式(一段时间后不重试)。

    编辑

    使用docker-compose run 会覆盖容器的入口点。因此,即使原本有等待数据库初始化的脚本,也不会运行。

    查看docs of the command

    首先,run 传递的命令会覆盖服务配置中定义的命令。例如,如果 Web 服务配置以 bash 启动,则 docker-compose run web python app.py 将其覆盖为 python app.py

    【讨论】:

    • 谢谢。这是有用的信息。似乎不同之处在于我使用的 Docker 映像提供的 bash 脚本。我用额外的信息更新了我的问题,但仍然希望为我的用例找到解决方案。
    • 这很有见地,将帮助我解决我的问题。我可能会将wait_for_db() 函数复制到我自己的测试脚本中。
    猜你喜欢
    • 2020-07-08
    • 2019-04-23
    • 1970-01-01
    • 2020-06-17
    • 2021-04-24
    • 2023-02-02
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多