mysql - 如何在 Docker 容器中设置 'spring.datasource.url'

标签 mysql spring spring-boot docker docker-compose

我创建了一个使用 MySQL 数据库的 Spring Boot 应用程序。我使用 docker-compose 来启动数据库。


services:
  adminer:
    image: adminer
    restart: always
    ports:
      - 8888:8080
  db:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'example' # TODO: Change this      
    volumes:
      - "./config/my.conf:/etc/mysql/conf.d/config-file.cnf"
      - "./data:/var/lib/mysql:rw"

Spring Boot 应用程序(后端)目前不使用 Docker,我在 Eclipse 中运行它。在启动后端之前,我必须为 IPAddress grep Docker 容器:

docker inspect mysql_ex_db_1 | grep 'IPAddress'

结果是这样的(这个确切的地址会不时改变)

                "IPAddress": "",
                    "IPAddress": "172.21.0.2", 

然后我使用这个值并在 Eclipse 中的 Application.properties 文件中设置 spring.datasource.url

spring.datasource.url=jdbc:mysql://172.21.0.2:3306/employee_management_system?allowPublicKeyRetrieval=true&useSSL=false&createDatabaseIfNotExist=true

在此之后,我可以在 Eclipse 中启动后端,到数据库的连接就在那里,一切正常。

现在我想将后端的启动从 Eclipse 移动到我用来启动数据库的同一个 docker-compose 文件。因此我构建了一个图像,并附加了 docker-compose 文件:

version: '3.1'

services:
  adminer:
    image: adminer
    restart: always
    ports:
      - 8888:8080
  db:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'example' # TODO: Change this      
    volumes:
      - "./config/my.conf:/etc/mysql/conf.d/config-file.cnf"
      - "./data:/var/lib/mysql:rw"
  backend:
    image: backend:latest
    restart: always
    ports:
      - 8090:8080

在这种情况下,如何在 spring.datasource.url 中配置 IP 地址? 每当我重新启动 mysql 容器时,确切的 IP 地址都会发生变化。

spring.datasource.url=jdbc:mysql://172.21.0.2:3306/employee_management_system?allowPublicKeyRetrieval=true&useSSL=false&createDatabaseIfNotExist=true

那么我应该写什么来代替'172.21.0.2'?

我在这里尝试了 localhost 但是它 似乎不起作用。

最佳答案

首先,您可以在 docker 镜像之外设置环境变量,例如 spring.datasource.url。这允许您根据部署需要动态设置这些变量(例如连接到开发或生产数据库)。

从您的 docker-compose 文件运行的所有 docker 容器都在同一虚拟网络中运行,并且它们的服务名称对应于该网络中的主机名。当您想从 dockerized spring 后端访问数据库时,主机名和端口将为 db:3306。您可以通过引入如下环境变量来覆盖 docker-compose 文件中的 spring.datasource.url:

version: '3.1'

services:
  adminer:
    image: adminer
    restart: always
    ports:
      - 8888:8080
  db:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'example' # TODO: Change this      
    volumes:
      - "./config/my.conf:/etc/mysql/conf.d/config-file.cnf"
      - "./data:/var/lib/mysql:rw"
  backend:
    image: backend:latest
    restart: always
    ports:
      - 8090:8080
    environment:
      spring.datasource.url: "jdbc:mysql://db:3306/employee_management_system?allowPublicKeyRetrieval=true&useSSL=false&createDatabaseIfNotExist=true"

关于mysql - 如何在 Docker 容器中设置 'spring.datasource.url',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66169935/

相关文章:

mysql - MySQL 中可以同时有超过 1 个 sql_mode 吗?

php - 使用简单的 PDO 查询未将发布值输入数据库

java - 无法解析类型 org.springframework.context.ApplicationContextAware。它是从所需的 .class 文件中间接引用的

spring - Spring XD是否支持Hadoop中的内存处理

spring - 微服务同步通信——服务到服务或消息代理

php - 产品创建/更新期间违反 magento 完整性约束

mysql - 如何在 Teradata 中为 SQL 联合创建表?

spring - 以编程方式访问由 property-placeholder 创建的属性

java - 如何为临时实体公开 odata 服务

java - kafka分区可以分布在多个kafka集群节点上吗?