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

我如何知道我的docker mysql容器何时启动,mysql已准备好接受查询?

羊舌成周
2023-03-14

部署了几个不同的docker容器,mysql是第一个。我想尽快运行脚本数据库是和继续建设其他容器。该脚本一直失败,因为当设置mysql(从这个官方mysql容器)的entrypoint脚本仍在运行时,它正试图运行。

sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=MY_ROOT_PASS -p 3306:3306 -d mysql
[..] wait for mysql to be ready [..]
mysql -h 127.0.0.1 -P 3306 -u root --password=MY_ROOT_PASS < MY_SQL_SCRIPT.sql

有没有办法等待入口点mysql安装脚本在docker容器内完成的信号?Bash睡眠似乎是一个次优的解决方案。

编辑:像这样的bash脚本。不是最优雅和有点蛮力,但工作像魅力。也许有人会觉得这很有用。

OUTPUT="Can't connect"
while [[ $OUTPUT == *"Can't connect"* ]]
do
    OUTPUT=$(mysql -h $APP_IP -P :$APP_PORT -u yyy --password=xxx <       ./my_script.sql 2>&1)
done

共有3个答案

萧嘉禧
2023-03-14

在对其他答案的评论中或多或少提到了这一点,但我认为它值得自己加入。

首先,可以按以下方式运行容器:

docker run --name mysql --health-cmd='mysqladmin ping --silent' -d mysql

Dockerfile中也有一个等效文件。

使用该命令,您的docker psdocker inspect将显示您的容器的健康状态。特别是对于mysql,这种方法的优点是mysqladmin在容器中可用,因此您不需要在docker主机上安装它。

然后,您可以简单地在bash脚本中循环,等待状态变为健康状态。下面的bash脚本是由Dennis创建的。

function getContainerHealth {
  docker inspect --format "{{.State.Health.Status}}" $1
}

function waitContainer {
  while STATUS=$(getContainerHealth $1); [ $STATUS != "healthy" ]; do 
    if [ $STATUS == "unhealthy" ]; then
      echo "Failed!"
      exit -1
    fi
    printf .
    lf=$'\n'
    sleep 1
  done
  printf "$lf"
}

现在,您可以在脚本中执行此操作:

waitContainer mysql

脚本将等待容器启动并运行。如果容器变得不健康,脚本将退出,这是可能的,例如docker主机内存不足,mysql无法为自己分配足够的内存。

常小白
2023-03-14

这个小bash循环等待mysql打开,不需要安装任何额外的包:

until nc -z -v -w30 $CFG_MYSQL_HOST 3306
do
  echo "Waiting for database connection..."
  # wait for 5 seconds before check again
  sleep 5
done
太叔航
2023-03-14

您可以安装mysql客户端包,并使用mysqladmin来ping目标服务器。使用多个docker容器时很有用。结合睡眠,创建一个简单的等待循环:

while ! mysqladmin ping -h"$DB_HOST" --silent; do
    sleep 1
done
 类似资料:
  • 我已经调试这段代码好几个小时了,试图让输出正确无误。它在早期工作,但输出中存在逻辑错误,因此我进入并在输出函数中添加了循环和一个额外参数。 现在g给我以下错误: Student.cpp:在成员函数“void Student::input data(std::string,int,STD::string 如何修复此代码?:

  • 问题内容: 我正在努力学习在PHP中使用mysqli编写预备语句,通常,如果我对查询有疑问,我只需将其回显到屏幕上,就可以看到第一步。 我如何用准备好的陈述来做到这一点? 替换变量后,我想查看SQL语句。 问题答案: 使用准备好的语句: 准备该语句时,它会发送到MySQL服务器 当您绑定变量+执行语句时,只有变量被发送到MySQL服务器 并且语句+绑定变量在MySQL服务器上执行-无需在每次执行语

  • 根据IBM文档:清除策略指定在检测到陈旧连接或致命连接错误时如何清除连接。有效值为EntirePool和FailingConnectionOnly。 问题:服务器如何/何时知道连接已过时?它是否会尽快(立即)清洗池任何连接都会过时,或者按照收获时间发生? 假设收割时间为180秒。假设收割线程上次在下午3:05运行,连接在下午3:06失效,服务器是在下午3:06自己清除池,还是只在下午3:08清除池

  • 我有下面的代码,我想在它上面关闭preparedStatement对象,因为它是作为一个来自sonar的bug提出的。 如何关闭preparedStatement对象?我看到的大多数示例大多使用try/finally或try with resources,然后创建对象并使用它try and close in finally。然而,在这里,对象是在单独的函数中创建的,它从那里返回,然后被使用。所以创

  • 问题内容: 我仅在将CSS文件注入HTML后才尝试显示Web视图。我试图将其放在onPageCommitVisible函数上,但它仅在以上23个api和d上有效。有人知道只有在CSS加载完成后才能显示webview吗?现在它“跳了起来”,在替换新CSS之前,我看到了第一秒钟的原始CSS。 这是我的InjestCSS函数: 如您在函数中所见,此函数将CSS代码注入HTML。 问题答案: 在少数地方可

  • 我想知道在spring Kafka中,当设置为时,commit是如何工作的。 下面是我在ContainerProperties.SetackMode(AbstractMessageListenerContainer.ackMode.Manual)中设置的属性; 代码 我正在按照spring kafka文档执行操作,但这只意味着我的消息被标记为已发送但未消费(这是我的理解)。 > 在这种情况下,我是