首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker-组合检查mysql连接是否准备就绪

Docker-组合检查mysql连接是否准备就绪
EN

Stack Overflow用户
提问于 2017-03-02 22:48:01
回答 16查看 138.5K关注 0票数 164

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

因此,我决定使用健康检查,并依赖于选项在码头组合文件v2。

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

代码语言:javascript
复制
app:
    ...
    depends_on:
      db:
      condition: service_healthy

另一方面,db进行以下健康检查:

代码语言:javascript
复制
db:
  ...
  healthcheck:
    test: TEST_GOES_HERE
    timeout: 20s
    retries: 10

我尝试过几种方法,比如:

  1. 确保数据库DIR是创建test: ["CMD", "test -f var/lib/mysql/db"]
  2. 获取mysql版本:test: ["CMD", "echo 'SELECT version();'| mysql"]
  3. Ping管理(将db容器标记为健康,但似乎不是有效的测试) test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]

有人有办法解决这个问题吗?

EN

回答 16

Stack Overflow用户

发布于 2017-03-13 05:42:14

代码语言:javascript
复制
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

在db容器正常运行之前,api容器将不会启动(基本上直到mysqladmin启动并接受连接为止)。

票数 159
EN

Stack Overflow用户

发布于 2019-01-18 07:56:31

condition在3.0-3.8版本中被删除了撰写规范,但现在又回来了!

使用compose v3.9+ (docker-Compositv1.29)的版本,您可以在depends_on中使用condition作为选项。

使用condition: service_completed_successfully告诉组合在启动依赖服务之前必须运行服务。

代码语言:javascript
复制
services:
  web:
    build: .
    depends_on:
      db:
        condition: service_completed_successfully
      redis:
        condition: service_completed_successfully
  redis:
    image: redis
  db:
    image: postgres

condition选项可以是:

  • service_started等价于简短的语法形式。
  • service_healthy正在等待服务的健康。用healthcheck选项定义健康
  • service_completed_successfully指定,在启动依赖服务之前,依赖项将运行到成功完成(添加到PR#8122的docker中)。

令人遗憾的是,这是相当糟糕的文件。我在码头论坛码头医生问题码头人员撰写问题,在码头组装e2e夹具上找到了对它的参考。不确定Docker v2是否支持它。

票数 47
EN

Stack Overflow用户

发布于 2019-02-24 16:55:21

这应该就够了

代码语言:javascript
复制
version: '3.4'
services:
  mysql:
    image: mysql
    ports: ['3306:3306']
    environment:
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    healthcheck:
      test: mysqladmin ping -h 127.0.0.1 -u $$MYSQL_USER --password=$$MYSQL_PASSWORD
      start_period: 5s
      interval: 5s
      timeout: 5s
      retries: 55
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42567475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档