簡體   English   中英

Docker:springboot容器無法連接到PostgreSql容器

[英]Docker: Springboot container cannot connect to PostgreSql Container

我正在構建一個 Spring Boot 應用程序,它使用 PostgreSQL 和 docker-compose。當我使用docker-compose up --build運行我的容器時,我的 Spring Boot 應用程序無法啟動,因為它沒有找到 883415717947.8 容器的主機名

Spring 開機 Dockerfile

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"]

docker-compose.yml

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:

應用程序.properties

spring.datasource.url=jdbc:postgresql://db:5432/my_db
spring.datasource.username=postgres
spring.datasource.password=postgres

錯誤 output

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM