Java Docker:Springboot容器无法连接到PostgreSql容器

Java Docker:Springboot容器无法连接到PostgreSql容器,java,postgresql,spring-boot,docker,docker-compose,Java,Postgresql,Spring Boot,Docker,Docker Compose,我正在构建一个使用PostgreSQL和docker compose的Spring启动应用程序。 当我使用docker compose up--build运行容器时,我的Spring Boot应用程序无法启动,因为它找不到PostgreSQL容器的主机名 弹簧靴Dockerfile docker-compose.yml 应用程序属性 错误输出 原因:java.net.UnknownHostException:db 我猜docker compose的虚拟网络还没有在Spring Boot Dock

我正在构建一个使用PostgreSQL和docker compose的Spring启动应用程序。 当我使用docker compose up--build运行容器时,我的Spring Boot应用程序无法启动,因为它找不到PostgreSQL容器的主机名

弹簧靴Dockerfile docker-compose.yml 应用程序属性 错误输出
原因:java.net.UnknownHostException:db

我猜docker compose的虚拟网络还没有在Spring Boot Dockerfile的构建阶段创建。 有没有办法解决这个问题?

这里有很多信息:

在web容器中,到db的连接字符串如下所示 postgres://db:5432,并从主机中获取连接字符串 看起来像postgres://{DOCKER_IP}:8001

这意味着在docker-compose.yaml中使用db:5432很好,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

我尝试了你的解决方案,但环境变量甚至没有加载。我得到了错误
java.net.UnknownHostException:${DB_HOST}
,好像application.properties没有用
DB
替换
${DB_HOST}
这是在容器中旋转时发生的吗?您可以使用
docker exec-it[containerId]bash检查,它将您带入容器,然后
env
列出环境变量。。。如果未将
DB\u HOST
正确设置为环境变量,则不会在application.properties文件中替换它。验证其设置后,变量应级联到应用程序中将整个项目复制到映像中,添加
WORKDIR/usr/src/app
,然后您应能够添加标准
RUN mvn clean package
。除非
pom.xml
中有错误,否则只要pom.xml在指定的目录中,该命令就应该运行。i、 e.不要只做
复制src/usr/src/app/src
,而是做
复制/usr/src/app
我刚刚检查了一下,发现DB_主机没有正确设置,这很奇怪,因为它是在我的docker组件中定义的。今晚我将尝试测试一下我的终端-应该不太难得到一个最低的工作版本
spring.datasource.url=jdbc:postgresql://db:5432/my_db
spring.datasource.username=postgres
spring.datasource.password=postgres
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:
spring.datasource.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_DATABASE}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}