【问题标题】:Wait for docker-compose to start before running another process在运行另一个进程之前等待 docker-compose 启动
【发布时间】:2020-04-24 12:15:44
【问题描述】:

我有一个使用 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

谢谢, 康纳

【问题讨论】:

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


    【解决方案1】:

    如果http://localhost:8080/health 表明测试已准备好运行,您可以考虑等待它成功后再继续。从 shell 执行 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 容器的容器。据我所知,在这种情况下如何在本地执行mvn 取决于您(Can you define optional docker-compose services? 似乎是一个好的开始),但它可能有助于处理容器依赖项给你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多