如何在 Docker 容器内设置“spring.datasource.url”

San*_*ejű 3 mysql spring docker spring-boot 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"
Run Code Online (Sandbox Code Playgroud)

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

docker inspect mysql_ex_db_1 | grep 'IPAddress'
Run Code Online (Sandbox Code Playgroud)

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

                "IPAddress": "",
                    "IPAddress": "172.21.0.2", 
Run Code Online (Sandbox Code Playgroud)

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

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

Run Code Online (Sandbox Code Playgroud)

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

现在我想将 Backend 的启动从 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
Run Code Online (Sandbox Code Playgroud)

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

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

Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

从 docker-compose 文件运行的所有 docker 容器都在同一虚拟网络中运行,并且它们的服务名称与其在该网络中的主机名相对应。当您想从 dockerized spring 后端访问数据库时,主机名和端口将为db:3306。您可以spring.datasource.url通过引入环境变量来覆盖 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
    environment:
      spring.datasource.url: "jdbc:mysql://db:3306/employee_management_system?allowPublicKeyRetrieval=true&useSSL=false&createDatabaseIfNotExist=true"
Run Code Online (Sandbox Code Playgroud)