【问题标题】:How to set 'spring.datasource.url' inside a Docker Container如何在 Docker 容器中设置“spring.datasource.url”
【发布时间】:2021-05-16 02:11:16
【问题描述】:

我创建了一个使用 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 中的IPAddress? 每当我重新启动 mysql 容器时,确切的 IPAddress 都会发生变化。

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

那么我应该写什么而不是'172.21.0.2'?

我在这里试过 localhost 但它 好像没用。

【问题讨论】:

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


    【解决方案1】:

    首先,您可以在 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"
    

    【讨论】:

      【解决方案2】:

      将此环境变量添加到您的backend 中的docker-compose

      backend:
        ...
        environment:
          - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/employee_management_system?allowPublicKeyRetrieval=true&useSSL=false&createDatabaseIfNotExist=true
      

      【讨论】:

        【解决方案3】:

        在您的 Spring Boot 应用程序中,您的 spring.datasource.url 必须是这样的:

        spring.datasource.url=jdbc:postgresql://${DATABASE_HOST}:5432/my_db
        

        (这里我连接到一个 postgres 数据库)。然后在 docker compose 中设置变量:

        ...
        environment:
          DATABASE_HOST:container_name
        

        您也可以在 docker-compose 外部进行测试,使用如下命令行:

        docker run -it -p 8080:8080 -e "JAVA_OPTS=-Xmx128m" --network=my_network -e DATABASE_HOST=postgres_container_name --name myapp myregistry/myimage:version
        

        【讨论】:

          猜你喜欢
          • 2014-12-28
          • 2021-04-07
          • 2021-03-29
          • 2022-11-15
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 1970-01-01
          相关资源
          最近更新 更多