![](/img/trans.png)
[英]Docker/Hibernate/PostgreSQL - Connecting container running Hibernate/SpringBoot app with a postgreSQL container not working
[英]Docker: Springboot container cannot connect to PostgreSql Container
我正在構建一個 Spring Boot 應用程序,它使用 PostgreSQL 和 docker-compose。當我使用docker-compose up --build
運行我的容器時,我的 Spring Boot 應用程序無法啟動,因為它沒有找到 883415717947.8 容器的主機名
FROM maven:3.6.3-openjdk-14-slim AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
FROM openjdk:14-slim
COPY --from=build /usr/src/app/target/server-0.0.1-SNAPSHOT.jar /usr/app/server-0.0.1-SNAPSHOT.jar
EXPOSE 9000
ENTRYPOINT ["java","-jar","/usr/app/server-0.0.1-SNAPSHOT.jar"]
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: my_db
ports:
- "5432:5432"
volumes:
- db-data:/var/lib/postgresql/data
networks:
- db-network
restart: always
server:
build: './server'
depends_on:
- db
restart: always
ports:
- "9000:9000"
networks:
- db-network
volumes:
- ./server:/server
networks:
db-network:
volumes:
db-data:
spring.datasource.url=jdbc:postgresql://db:5432/my_db
spring.datasource.username=postgres
spring.datasource.password=postgres
Caused by: java.net.UnknownHostException: db
我的猜測是在 Spring 引導 Dockerfile 的構建階段尚未創建 docker-compose 的 virtual.network。關於如何解決此問題的任何想法?
這里有很多信息: https://docs.docker.com/compose.networking/
在 web 容器中,您到 db 的連接字符串看起來像 postgres://db:5432,而從主機看,連接字符串看起來像 postgres://{DOCKER_IP}:8001。
這就是說 db:5432 可以在 docker-compose.yaml 中使用,並且將傳遞 IP 地址(不是“db”),但在您的應用程序代碼外部使用它是行不通的。 但是,您可以從docker-compose.yaml
db
作為應用程序輸入變量傳遞,您的應用程序可以將其填寫到配置文件中。 這將使您能夠連接。
像這樣外部化配置是相當普遍的做法,因此應該是一個相對容易的修復。
例如:
Docker-compose.yaml
version: '3'
services:
db:
container_name: db
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: my_db
ports:
- "5432:5432"
volumes:
- db-data:/var/lib/postgresql/data
networks:
- db-network
restart: always
server:
build: './server'
depends_on:
- db
environment:
DB_HOST: db # untested, but there should be a way to pass this in
DB_PORT: 5432
DB_DATABASE: my_db
DB_USER: postgres
DB_PASSWORD: postgres
restart: always
ports:
- "9000:9000"
networks:
- db-network
volumes:
- ./server:/server
networks:
db-network:
volumes:
db-data:
然后在src/main/java/resources/application.properties
下有一個 application.properties 文件
spring.datasource.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_DATABASE}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
這篇文章徹底解決了我的問題。 事實證明,maven 在構建 .jar 文件時試圖建立與數據庫的連接。 我所要做的就是用這條線修改我的 Dockerfile RUN mvn -f /usr/src/app/pom.xml clean package -DskipTests
。
請注意,在構建圖像時,該服務將無法訪問數據庫,因為它尚未運行。 只有在構建鏡像並且容器運行之后,服務才能訪問。 因此,當您嘗試將主機作為 db 傳遞時,它在構建階段尚不可用。 它僅在數據庫容器開始運行后可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.