【问题标题】:Dockerized Spring Boot app can't connect to database containerDockerized Spring Boot 应用程序无法连接到数据库容器
【发布时间】:2020-02-04 16:23:44
【问题描述】:

我有一个带有 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 但它说是未知主机

【问题讨论】:

  • 那么 DB 容器是否能够正常启动?
  • @daniu 当我没有在 docker-compose 文件中将数据库指定为服务时,是的,它可以正常启动
  • @localhost:32769 替换为您的Oracle Database container 名称以及port number
  • @malverndongeni 所以基本上:jdbc:oracle:thin:@ORA12201_1/ORCLPDB1.localdomain ? (ORA12201_1) 是容器名称吗?如果我理解正确的话,它会给我一个例外,说这不是一个有效的数据库 url
  • 试试这个environment: - DATABASE_HOST=ORA12201_1 - DATABASE_USER= username - DATABASE_PASSWORD= password - DATABASE_NAME= NameOfYourDatabase - DATABASE_PORT= 32769

标签: spring-boot docker docker-compose docker-networking


【解决方案1】:

在您的 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

【讨论】:

  • 我尝试了您的方法并用作图像:container-registry.oracle.com/database/enterprise:12.2.0.1 但出现以下错误:oracle-database_1 | /home/oracle/setup/configDBora.sh:第 161 行:回显:写入错误:
  • 请分享完整的错误。尝试单独运行这个 oracle 映像,然后尝试使用 SQL 开发人员连接到您的映像
  • oracle-database_1 | /home/oracle/setup/configDBora.sh:第 206 行:/u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/tnsnames.ora:没有这样的文件或目录 lsnrctl:加载共享库时出错: libclntsh.so.12.1:无法打开共享对象文件:没有这样的文件或目录
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 2020-05-17
  • 2020-12-23
  • 2019-11-06
  • 2017-02-01
  • 2019-12-24
  • 2021-01-29
  • 2019-10-19
相关资源
最近更新 更多