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

Mysql 如何在Docker容器中设置“spring.datasource.url”,mysql,spring,spring-boot,docker,docker-compose,Mysql,Spring,Spring Boot,Docker,Docker Compose,我创建了一个使用MySQL数据库的Spring启动应用程序。我使用docker compose启动数据库 services: adminer: image: adminer restart: always ports: - 8888:8080 db: image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: 'example' # T

我创建了一个使用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中运行它。在启动后端之前,我必须将Docker容器grep为IPAddress:

docker inspect mysql_ex_db_1 | grep 'IPAddress'
这样的结果就是,这个确切的地址会不断变化

                "IPAddress": "",
                    "IPAddress": "172.21.0.2", 
然后取这个值,并在文件Application.properties中设置Eclipse中的spring.datasource.url

在此之后,我可以在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容器时,确切的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 compose中将此环境变量添加到后端:


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


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"
从docker compose文件运行的所有docker容器都在同一虚拟网络中运行,它们的服务名称对应于该网络中的主机名。当您想从停靠的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"
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"