当前位置: 首页 > 知识库问答 >
问题:

Docker compose检查mysql连接是否就绪

荣俊杰
2023-03-14

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

所以我决定使用healthcheck并依赖于docker compose file v2中的选项。

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

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

另一方面,db有以下健康检查

db:
  ...
  healthcheck:
    test: TEST_GOES_HERE
    timeout: 20s
    retries: 10

我尝试了一些方法,比如:

  1. 确保创建了db目录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”]

有人有解决办法吗?

共有3个答案

谢誉
2023-03-14

这应该够了

version: '2.1'
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
公孙宇
2023-03-14

如果您使用的是docker compose v3,条件作为依赖的选项已被删除。

建议的路径是使用等待它dockerize等待。在docker compose.yml文件中,将命令更改为:

command: sh -c 'bin/wait-for db:3306 -- bundle exec rails s'

我个人更喜欢等待,因为它可以在Alpine容器中运行(sh兼容,不依赖于bash)。缺点是它依赖于netcat,因此如果您决定使用它,请确保容器中安装了netcat,或者将其安装在Dockerfile中,例如:

# for Alpine image:
RUN apk update && apk add netcat-openbsd

# otherwise:
RUN apt-get -q update && apt-get -qy install netcat

撰写了一篇关于启动顺序的好文档。

我还分叉了等待项目,以便它可以检查健康的HTTP状态(它使用wget)。然后你可以做这样的事情:

command: sh -c 'bin/wait-for http://api/ping -- jest test'

PS:PR也准备合并,以将该容量添加到<代码>等待<代码>项目中。

施鸿
2023-03-14
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。来自MySQL官方网站的NET连接器。我正在尝试从我的C#程序到Mysql db建立安全的SSL连接。Mysql服务器允许使用SSL连接。变量设置为和,和被指定。 用户的权限为: 所以我假设,这个用户没有SSL就无法登录?我说得对吗? 我在C#程序中的连接字符串如下所示: 请确保此连接字符串没有指向证书文件的任何路径!它只有“SSLMode=Required”选项。是否可以在

  • 问题内容: 如何检查连接是否已在事务中?我正在使用Microsoft SQL Server数据库文件。 问题答案: 经过一番搜索,我发现了另一个“堆栈溢出”问题。事实证明,您不能在ADO.NET中嵌套事务。尝试时,您可能最终会启动两个不相关的事务,这会导致并行事务错误。 要查看连接当前是否在事务中,可以执行以下操作: 这将返回嵌套事务的数量。 请注意,您可以手动嵌套事务,而无需使用SqlTrans

  • 问题内容: 如何使用Javascript检查互联网连接?这样,我可以有一些条件说“在生产过程中使用Google缓存的JQuery版本,在开发过程中使用该版本或本地版本,具体取决于Internet连接”。 问题答案: 针对您的特定情况的最佳选择可能是: 在您的结束标记之前: 鉴于您的问题集中在jQuery上,这可能是最简单的方法。 如果您想要一个更强大的解决方案,可以尝试: 阅读有关W3C在脱机We

  • 我在网上搜索了很长一段时间,但我找不到我要找的东西。 如果我的设备已经连接到蓝牙设备(/在我启动应用程序之前),我如何通过我的应用程序发现。 我希望有类似bool BluetoothAdapter的东西。isPaired()

  • 但是它太复杂了,无法从Java代码中完成,我认为这不是我应该使用的方向。 提前谢了。

  • 我试着检查一个链表的最后一个节点是否指向头部。这段代码似乎为问题给出了肯定的结果,但也为包含指向非头节点的节点的列表给出了假肯定。 我尝试了不同的方法,比如检查慢节点是否等于返回true点的head,但这似乎不起作用。 有什么建议吗?