在我的 spring-boot 应用程序启动之前,我如何等待数据库容器启动

Posted

技术标签:

【中文标题】在我的 spring-boot 应用程序启动之前,我如何等待数据库容器启动【英文标题】:How do i wait for a db container to be up before my spring-boot app starts 【发布时间】:2017-02-19 10:42:07 【问题描述】:

我有一个与 couchbase 对话的 spring-boot 应用程序。我将 spring 应用程序构建为 docker 映像。为了使应用程序运行,需要在 couchbase 设置中满足一些先决条件。当我首先运行我的 couchbase 映像然后运行我的 spring-boot 应用程序映像时,一切运行正常。但是,我需要将其自动化并从 docker-compose 文件运行,这意味着通过单个 docker-compose up 命令我应该能够首先运行 couchbase 映像,使用所有预设配置它,然后开始运行 spring-boot应用程序。我遇到了很多讨论线程,但不幸的是我无法以某种方式使其工作。我尝试使用 cmd 和入口点,但没有成功。这是我的 docker-compose 文件

version: "2"
services:
  expensetracker-cb:
    image: chakrar27/expensetracker-cb
    command: sh test_hello.sh
    ports:
      - 8080:8080
    depends_on:
      - mycouchbase

  mycouchbase:
    image: chakrar27/couchbase_new_10_08_2016
    ports:
      - 8091:8091
      - 8092:8092 
      - 8093:8093 
      - 8094:8094
      - 11210:11210

事实上它根本不会触发 test_hello.sh。这是 spring-boot 费用跟踪器应用程序的 dockerfile

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD expensetracker-cb-0.1.0.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

有人可以帮忙吗?

【问题讨论】:

这可能对***.com/questions/31746182/…有帮助 【参考方案1】:

好的...我可以通过将脚本包含在应用程序容器的 Dockerfile 中来使其正常工作。不是最好的解决方案,因为我觉得等待代码不应该是容器本身的一部分。此外,我需要找到一种方法来等待 couchbase 集群启动并使用示例存储桶运行,并将其包含在脚本或 couchbase 容器本身中。现在虽然这个变通办法对我有用。这是 dockerfile 的内容

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD expensetracker-cb-0.1.0.jar app.jar
RUN sh -c 'touch /app.jar'
ADD test_hello.sh .
RUN chmod +x test_hello.sh
CMD sh test_hello.sh

【讨论】:

【参考方案2】:

是的。

首先在您的 docker-compose.yml 中使用入口点而不是命令。由于您的入口点调用 java.lang.

第二次在容器中包含你的脚本:

version: "2"
services:
  expensetracker-cb:
    image: chakrar27/expensetracker-cb
    entrypoint: sh /mnt/test_hello.sh
    ports:
      - 8080:8080
    depends_on:
      - mycouchbase
    volumes:
      - ./test_hello.sh:/mnt/test_hello.sh


  mycouchbase:
    image: chakrar27/couchbase_new_10_08_2016
    ports:
      - 8091:8091
      - 8092:8092 
      - 8093:8093 
      - 8094:8094
      - 11210:11210

示例 test_hello.sh

#! /bin/bash

echo "Put your waiting code here, I will wait for 1 min"
sleep 60


java -Djava.security.egd=file:/dev/./urandom -jar /app.jar

我在使用 Oracle 时遇到了同样的问题,我最后的办法是尝试执行 SQL 直到它成功。我认为使用沙发底座你可以做类似的事情。

【讨论】:

我在尝试通过入口点运行时收到此错误错误:对于费用跟踪器-cb 无法启动服务费用跟踪器-cb:oci 运行时错误:exec:“./test_hello.sh”:stat ./test_hello。 sh:没有这样的文件或目录。该脚本文件与 compose.yml 位于同一目录中。我将 docker-compose 更改为这个入口点:./test_hello.sh 好的,您需要做的第一件事就是将您的脚本包含在您的容器中。通过修改 dockerfile 或挂载卷。我已经更新了答案 好的...随着您的更改脚本执行。但是我有一个新问题,看起来我的应用程序容器没有运行。我收到此错误:“expensetrackercb_expensetracker-cb_1 以代码 0 退出”。我在这里github.com/docker/compose/issues/3140 发现了一个类似的问题。当我做 docker 检查时,我看到了这个: 我看到您的容器正在运行,但我不知道您是如何指定数据库的 IP 地址的。当您使用 docker-compose 时,您可以使用服务名称,只需检查容器中的 /etc/hosts 即可查看名称。 如果我的回答解决了您的问题,请放弃否定点,并将其作为正确答案。

以上是关于在我的 spring-boot 应用程序启动之前,我如何等待数据库容器启动的主要内容,如果未能解决你的问题,请参考以下文章

如何将 spring-boot 作为客户端应用程序运行?

所有 Spring-Boot 应用程序始终显示弹出登录

列出所有已部署的 REST 端点(spring-boot、jersey)

如何使用新的spring-boot JAR重新启动容器而没有jar的绝对路径?

如何通过命令行启动 spring-boot 应用程序?

spring-boot 无法在 docker 中启动