【发布时间】:2017-06-27 23:53:04
【问题描述】:
我遇到了一个我无法弄清楚的问题。我想要实现的是有一个 gradle 任务,它产生一个 docker-compose 进程,它是一个 mssql 服务器,然后使用 liquibase 运行所有迁移并为数据库播种。
但问题是docker需要一些时间来启动服务器,而liquibase在它启动之前就已经运行了。
我所做的是使用 -d 标志在守护进程中启动 docker-compose,然后使用循环 ping 服务器,直到端口 1433 响应,然后让 gradle 继续执行其他相关任务(实际上创建数据库并为其播种)。
这就是我所做的:
task checkDbStatusAndGetsItUp(){
group "localEnvironment"
description "Check current local db is up or sets it up"
dependsOn 'cloneEntityProject'
println 'Checking db Status and setting it up'
println '---------------------------'
def stdoutDocker = new ByteArrayOutputStream()
exec{
executable 'sh'
args "-c", """
docker ps | grep microsoft | wc -c
"""
standardOutput = stdoutDocker
}
doLast {
if (stdoutDocker.toString().trim() == '0') {
exec {
executable 'sh'
workingDir 'setup/dp-entidades'
args "-c", """
docker-compose up -d
"""
}
}
def shouldStop = false;
while (shouldStop == false){
def stdoutPing = new ByteArrayOutputStream()
exec{
workingDir 'setup/dp-entidades'
executable 'sh'
args """
nc -zv localhost 1433
"""
ignoreExitValue = true
standardOutput = stdoutPing
}
println stdoutPing.toString();
sleep(1000)
}
}
}
我从上面的代码中得到的是一个循环,表明 docker 永远不会启动它。但是,如果我打开另一个终端并手动 ping 它,它就可以工作,并且数据库实际上已经启动。 (我什至尝试使用 telnet,结果相同)
我需要做什么,从 gradle 获得 ping,如果成功连接到数据库,让任务继续?
【问题讨论】:
-
我从上面的代码得到的结果是: sh: 0: Can't open nc -zv localhost 1433 sh: 0: Can't open nc -zv localhost 1433 sh: 0: Can't打开 nc -zv localhost 1433 sh: 0: 无法打开 nc -zv localhost 1433 sh: 0: 无法打开 nc -zv localhost 1433
标签: java gradle docker-compose gradlew