gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:18:47 24 4
gpt4 key购买 nike

我有一个 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 容器的状态。

最佳答案

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

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

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

希望这有帮助。

关于java - 由于依赖于 postgres 容器,spring boot 容器未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58610781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com