我部署了几个不同的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
在对其他答案的评论中或多或少提到了这一点,但我认为它值得自己加入。
首先,可以按以下方式运行容器:
docker run --name mysql --health-cmd='mysqladmin ping --silent' -d mysql
Dockerfile中也有一个等效文件。
使用该命令,您的docker ps
和docker 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无法为自己分配足够的内存。
这个小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
您可以安装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文档执行操作,但这只意味着我的消息被标记为已发送但未消费(这是我的理解)。 > 在这种情况下,我是