如何在docker容器中设置“spring.datasource.url”

juud5qan  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(399)

我创建了一个使用mysql数据库的spring启动应用程序。我使用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"

SpringBoot应用程序(后端)目前不使用docker,我在eclipse中运行它。在启动后端之前,我必须为ipaddress grep docker容器:

docker inspect mysql_ex_db_1 | grep 'IPAddress'

结果是这样的(这个确切的地址会随着时间的变化)

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

然后取这个值,设置 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

在这之后,我可以在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

在这种情况下,如何在中配置IP地址 spring.datasource.url ? 每当我重新启动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,但似乎不起作用。

q5iwbnjs

q5iwbnjs1#

首先,可以设置如下环境变量 spring.datasource.url 在你的 Docker 形象之外。这允许您根据部署需要动态设置这些变量(比如连接到dev或prod数据库)。
从docker compose文件运行的所有docker容器都运行在同一个虚拟网络中,它们的服务名称与其在该网络中的主机名相对应。当您想从停靠的spring后端访问数据库时,主机名和端口将是 db:3306 . 您可以覆盖 spring.datasource.url 在docker文件中,通过引入如下环境变量来编写:

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"
lg40wkob

lg40wkob2#

将此环境变量添加到 backenddocker-compose :

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

相关问题