由于依赖于postgres容器,spring boot容器未运行

时间:2019-10-29 15:40:40

标签: java spring maven spring-boot docker

我有一个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容器的状态,而把很多东西放在这个后端容器中。

1 个答案:

答案 0 :(得分:0)

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

作为一种廉价的解决方法,您可以执行以下操作:

  1. 仅启动postgres-db容器:$ docker-compose up -d postgres-db
  2. 稍等片刻(例如10到20秒)
  3. $ docker-compose up -d --build

希望这会有所帮助。