等待docker-compose启动,然后再运行另一个进程

时间:2020-04-24 03:49:27

标签: docker maven docker-compose continuous-integration gitlab

我有一个使用docker-compose和maven运行集成测试的应用程序。当我可以控制何时执行命令时,此应用程序可在本地工作。我首先运行docker-compose up,然后等待一切完成。然后打开另一个窗口,然后对刚刚启动的docker-compose容器运行集成测试:mvn verify -P integration-test -DBASE_URL=http://localhost:8080

但是,当我在gitlab中运行时,我不知道如何等待运行mvn命令,直到容器旋转起来。有谁对我该怎么做有一个想法(请记住,我认为我必须在gitlab中运行docker-compose up -d,否则会阻止运行器)。我看到的错误日志是:org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:8080/health": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

完整的gitlab输出可以在这里找到:https://gitlab.com/connorbutch/trading-app/-/jobs/524923294

谢谢, 康纳

1 个答案:

答案 0 :(得分:0)

如果http://localhost:8080/health指示测试已准备就绪,可以运行,则可以考虑等待测试成功。从外壳执行docker-compose和mvn很自然,因此我将在此处提供bash。

wait_for_health() {
  for i in $(seq 1 5); do 
    if curl -s 'http://localhost:8080/health'; then return 0; fi
    sleep 2
  done
  echo "localhost was never ready"
  exit 1
}

wait_for_health 

如果您正在考虑清理,bash可以在退出时运行命令,也许像这样:

trap "docker-compose down" EXIT

最后,请记住在设置-e的情况下运行脚本。您可以将其放在shebang #!/bin/bash -eset -e上,但是如果您未设置-e,则失败的命令会违反直觉,不会导致脚本失败。这通常不是您想要的。

或者,您可以从docker-compose内部运行mvn。您必须在docker中描述您的Maven环境和辅助设备,但是您可以添加一个依赖于Web容器的容器。据我所知,这取决于您自己在这种情况下如何在本地执行mvnCan you define optional docker-compose services?似乎是一个好的开始),但这可能会有所帮助为您处理容器依赖项。