Spring boot 如何在spring boot应用程序启动之前等待db容器启动

Spring boot 如何在spring boot应用程序启动之前等待db容器启动,spring-boot,docker,docker-compose,Spring Boot,Docker,Docker Compose,我有一个与couchbase对话的spring boot应用程序。我将spring应用程序构建为docker映像。在couchbase设置中需要满足一些先决条件才能运行应用程序。当我先运行couchbase映像,然后运行spring boot应用程序映像时,一切都正常运行。然而,我需要这是自动化的,并从docker compose文件运行,这意味着通过一个docker compose up命令,我应该能够首先运行couchbase映像,使用所有预设配置它,然后开始运行spring boot应用程

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

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 expensetracker应用程序的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"]
有人能帮忙吗

是的

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

第二,将脚本包含在容器中:

版本:“2”
服务:
费用:
图片:chakrar27/expensetracker cb
入口点:sh/mnt/test\u hello.sh
端口:
- 8080:8080
取决于:
-霉口碱
卷数:
-/test\u hello.sh:/mnt/test\u hello.sh
mycouchbase:
图片:chakrar27/couchbase_new_10_08_2016
端口:
- 8091:8091
- 8092:8092 
- 8093:8093 
- 8094:8094
- 11210:11210
示例test_hello.sh

#/bin/bash
echo“把你的等待代码放在这里,我会等1分钟”
睡60
java-Djava.security.egd=文件:/dev//uradom-jar/app.jar

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

好的……我可以通过将脚本包含在应用程序容器的Dockerfile中来实现它。这不是最好的解决方案,因为我觉得等待代码不应该是容器本身的一部分。此外,我需要找到一种方法,等待couchbase集群启动并使用示例bucket运行,并将其包含在脚本或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

这可能有助于我在尝试通过入口点运行时遇到此错误错误错误:对于expensetracker cb无法启动服务expensetracker cb:oci运行时错误:exec:“./test\u hello.sh”:stat./test\u hello.sh:没有此类文件或目录。脚本文件与compose.yml存在于同一目录中。我将docker compose更改为以下入口点:./test\u hello.shOk您需要做的第一件事是将脚本包含在容器中。通过修改dockerfile或装入卷。我已经用你的更改更新了答案OK…脚本已执行。但是我有一个新问题,看起来我的应用程序容器没有运行。我收到此错误:“expensetrackercb\u expensetracker-cb\u 1已退出,代码为0”。我在这里发现了类似的问题。当我进行docker检查时,我看到这样的情况:我看到您的容器正在运行,我不知道您是如何指定数据库的IP地址的。当您使用docker compose时,您可以使用服务名称,只需检查容器中的you/etc/hosts即可查看名称。如果我的答案解决了您的问题,请删除否定点并将其作为正确答案进行检查。