【发布时间】: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