首页 > 解决方案 > Dockerized Spring Boot 应用程序无法连接到数据库容器

问题描述

我有一个带有 gradle 和 Hibernate 的基本 Spring Boot 应用程序,它调用 Oracle 数据库,该数据库位于 docker 容器中。

我使用插件“com.google.cloud.tools.jib”并使用以下命令创建了 Spring Boot 应用程序的 Docker 映像:

./gradlew jibDockerBuild --image=app1

我已经创建了一个用户定义的网络(我们称之为my_network),并且我已经将数据库容器附加到上述网络。

我有一个 docker 文件,即使我将图像指定为服务并在运行时使用my_network我在 CMD 中点击“docker-compose up”命令,我也会收到以下异常:

java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection

docker-compose 文件如下:

version: '3.7'

networks:
    my_network:
        external: 
            name: my_network

services:
   app1:
   image: "app1"
   ports:
     - "9090:9090"
   environment: 
     SPRING_DATASOURCE_URL: "jdbc:oracle:thin:@localhost:32769/ORCLPDB1.localdomain"
     SPRING_DATASOURCE_USERNAME: username
     SPRING_DATASOURCE_PASSWORD: password 
   networks:
     - my_network

尝试了解决方案但没有结果:

  1. 将数据库指定为服务,所以基本上让它在我第一次点击“docker-compose up”时创建,并且在服务 app1 中指定了标签depends_on,但创建的数据库容器将处于健康状态:在 app1 启动很久之后的启动状态,并且坠毁
  2. 让网络从 docker-compose 文件内部创建,但行为与所问问题相同
  3. 在数据库 url 中将localhost 替换为host.docker.internal但它说是未知主机

标签: spring-bootdockerdocker-composedocker-networking

解决方案


在您的 Docker-compose 文件中。创建 Oracle 数据库容器,然后创建 API 容器,如下所示

version: '3.7'
services:
  oracle-database:
      image: Your oracleImage
      environment:
         //define your oracle db settings..eg default password,users etc
      volumes:
            - /data/oracle
      ports:
        - 127.0.0.1: 32769:32769/tcp

  api1:
    image: api1
    ports:
      - 127.0.0.1:9090:9090/tcp
    depends_on:
     - oracle-database
    environment:
       - DATABASE_HOST=oracle-database
       - DATABASE_USER= username
       - DATABASE_PASSWORD=password
       - DATABASE_NAME= NameOfYourDatabase
       - DATABASE_PORT= 32769

推荐阅读