【问题标题】:spring boot container not running because of dependancy on postgres container由于依赖于 postgres 容器,spring boot 容器没有运行
【发布时间】:2020-02-24 21:23:11
【问题描述】:

我有一个 postgres 容器和一个 spring boot 容器。我正在使用 docker-compose 运行它们。

下面是docker-compose.yml 文件:

version: '3'
services:
  backend:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "8080:8080"
    depends_on:
      - postgres-db
    restart: always
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-db:5432/testDb
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root
  postgres-db:
    working_dir: /home/models
    image: postgres:11.3-alpine
    restart: always
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=testDb
    ports:
      - "5432:5432"
    volumes:
      - ./pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

这是Dockerfile.dev

FROM maven:3-jdk-8

ENV HOME=/home/usr/app

RUN mkdir -p $HOME

WORKDIR $HOME

ADD pom.xml $HOME

RUN ["/usr/local/bin/mvn-entrypoint.sh", "mvn", "dependency:go-offline"]

ADD . $HOME

RUN ["mvn", "package"]

CMD ["java","-jar","/usr/app/testApp-1.0.0-SNAPSHOT.jar"]

这是application.properties 文件

spring.datasource.url=jdbc:postgresql://postgres-db:5432/testDb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=validate

但是当我使用 docker-container up 运行容器时,我收到错误消息,提示与数据库的连接失败并且容器停止。

编辑: 我添加了以下db-check.sh 文件用于检查 db 的状态

#!/bin/sh
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until PGPASSWORD="password" psql -h "$host" -U "root" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done


>&2 echo "Postgres is up - executing command"
exec $cmd

新的Dockerfile.dev 看起来像:

FROM maven:3-jdk-8

ENV HOME=/home/usr/app

RUN mkdir -p $HOME

WORKDIR $HOME

ADD db-check.sh $HOME

RUN chmod +x db-check.sh

RUN ["./db-check.sh", "postgres-db:5432", "/usr/local/bin/mvn-entrypoint.sh", "mvn", "dependency:go-offline"]

ADD . $HOME

RUN ["mvn", "package"]

CMD ["java","-jar","/usr/app/testApp-1.0.0-SNAPSHOT.jar"]

但是为了让这个脚本成功运行,我需要在后端容器中安装 psql。有没有其他方法可以检查这个,因为如果我觉得我在这个单一的后端容器中放了很多东西只是为了检查 postgres 容器的状态。

【问题讨论】:

  • 看起来你的 java 容器是在 postgres 完全启动之前启动的。看看Control startup and shutdown order in Compose
  • 所以depends_on 参数不能单独工作,我需要添加一个支持脚本@michalk?
  • depends_on 仅确保容器先于其他容器启动 - 这并不一定意味着它已准备好接受连接。
  • 文档链接消除了我的疑虑。谢谢!
  • @michalk 我已经编辑了这个问题,还有一些疑问。你能帮我解决这个问题吗?

标签: java spring maven spring-boot docker


【解决方案1】:

正如其他人所说,postgres-db 容器可能还没有准备好,因为它必须在第一次运行时初始化。

作为一种廉价的解决方法,您可以这样做:

  1. 仅启动 postgres-db 容器:$ docker-compose up -d postgres-db
  2. 等一下(比如说 10-20 秒)
  3. $ docker-compose up -d --build

希望这会有所帮助。

【讨论】:

  • 是的,这个解决方案有效,我之前使用过,但我想要一种更自动化的方式,这也有助于部署阶段。
猜你喜欢
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 2022-07-20
  • 2015-02-26
  • 2018-10-03
  • 2020-02-25
相关资源
最近更新 更多