我有一个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容器的状态,而把很多东西放在这个后端容器中。
答案 0 :(得分:0)
正如其他人所述,postgres-db
容器可能尚未准备好,因为它必须在第一次运行时初始化。
作为一种廉价的解决方法,您可以执行以下操作:
$ docker-compose up -d postgres-db
$ docker-compose up -d --build
希望这会有所帮助。