我试图确保我的应用程序容器在 db 容器启动并准备接受连接之前不会运行迁移/启动。

所以我决定使用健康检查并依赖于 docker compose 文件 v2 中的选项。

在应用程序中,我有以下内容

app:
    ...
    depends_on:
      db:
      condition: service_healthy

另一方面,数据库具有以下健康检查
db:
  ...
  healthcheck:
    test: TEST_GOES_HERE
    timeout: 20s
    retries: 10

我尝试了几种方法,例如:
  • 确保创建了 db DIRtest: ["CMD", "test -f var/lib/mysql/db"]
  • 获取mysql版本:test: ["CMD", "echo 'SELECT version();'| mysql"]
  • Ping 管理员(将 db 容器标记为健康,但似乎不是有效的测试)test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]

  • 有没有人有解决方案?

    最佳答案

    version: "2.1"
    services:
        api:
            build: .
            container_name: api
            ports:
                - "8080:8080"
            depends_on:
                db:
                    condition: service_healthy
        db:
            container_name: db
            image: mysql
            ports:
                - "3306"
            environment:
                MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
                MYSQL_USER: "user"
                MYSQL_PASSWORD: "password"
                MYSQL_DATABASE: "database"
            healthcheck:
                test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
                timeout: 20s
                retries: 10
    

    api 容器在 db 容器健康之前不会启动(基本上直到 mysqladmin 启动并接受连接。)

    关于mysql - Docker-compose 检查 mysql 连接是否准备就绪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42567475/

    10-16 16:08