如何让一个服务等待另一个准备好?

How to make a service wait for another to be ready?

我正在使用带 mysql 数据库的飞路。我将它们用作 docker-compose 中的服务,然后在 testcontainer 的 DockerComposeEnvironment 中使用它。问题是,即使我在 'flyway' 服务中为 MySQL 'db' 添加了 depends_on 键,testcontainer 首先启动 flyway,这导致未应用迁移。

我想知道有没有什么方法可以让flyway容器运行只有在db容器准备好后才可以?

我正在使用这段代码来初始化我的测试docker-compose环境(test_mysqlflyway_c是服务容器的名称):

const environment = await new DockerComposeEnvironment(composeFilePath, composeFile)
        .withWaitStrategy('test_mysql', Wait.forLogMessage(`ready for connections. Bind-address: '::' port:`))
        .withWaitStrategy('flyway_c', Wait.forLogMessage(`Successfully applied`))
        .withStartupTimeout(120000)
        .up();

这是我的 docker-compose 文件:

version: '3'
services:
  db:
    image: mysql:8.0.26
    environment:
      - MYSQL_DATABASE=test_db
      - MYSQL_ROOT_PASSWORD=pass
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
    ports:
      - '3306:3306'
      - '33060:33060'
    expose:
      - '3306'
    container_name: test_mysql
  flyway:
    image: flyway/flyway
    command: -url=jdbc:mysql://db -schemas=test_db -user=root -password=pass -connectRetries=100 migrate
    volumes:
      - .:/flyway/sql
    depends_on:
      - db
    container_name: flyway_c

如有任何帮助,我们将不胜感激。谢谢!

编辑:

这个问题不是由 docker-compose 引起的。换句话说,服务 flyway 确实等待 db 如果它们是 运行 和 docker-compose up 但当 运行 在 中时它们失败测试容器 npm 库。所以, 并没有真正解决这个问题。

我已经添加了我用来为我解决这个问题的答案。谢谢!

经过长时间的记录和调试,问题似乎是超时。结果证明我指定的 120000 毫秒不足以启动 MySQL 容器。将超时增加到 150000 毫秒就可以了。