Docker编写了一个spring服务和一个mysql服务,但init.sql不加载,Postman返回空数据

Docker编写了一个spring服务和一个mysql服务,但init.sql不加载,Postman返回空数据,mysql,spring,docker,docker-compose,dockerfile,Mysql,Spring,Docker,Docker Compose,Dockerfile,我是第一次和Docker一起工作。在我的工作中,他们要求我使用docker compose部署一个完整的应用程序,我现在正在学习 我有一个docker-compose.yml,它启动两个服务:一个用于spring,另一个用于MySQL Spring使用Dockerfile构建映像 MySQL使用的是官方的MySQL镜像 我不知道如何加载init.sql来初始化并将数据加载到MySQL容器的数据库中 我尝试使用另一个Dockerfile将init.sql复制到MySQL容器中,但是, 在创建图

我是第一次和Docker一起工作。在我的工作中,他们要求我使用
docker compose
部署一个完整的应用程序,我现在正在学习

我有一个docker-compose.yml,它启动两个服务:一个用于spring,另一个用于MySQL

  • Spring使用Dockerfile构建映像
  • MySQL使用的是官方的MySQL镜像
我不知道如何加载
init.sql
来初始化并将数据加载到MySQL容器的数据库中

我尝试使用另一个Dockerfile将init.sql复制到MySQL容器中,但是, 在创建图像或运行容器时,如何告诉compose使用它

这是针对Windows 10操作系统桌面的。Docker版本18.09.2。Docker compose版本1.23.2 Docker桌面

Docker compose.yml

version: '3.7'

services:
    mysql-docker-container:
        image: mysql
        container_name: mysql-docker-container
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=database
            - MYSQL_USER=user
            - MYSQL_PASSWORD=user
        ports:
            - 2012:3306
        tty: true

    spring-jpa-app:
        build:
            context: .
            dockerfile: Dockerfile     
        container_name: spring-jpa-app
        links:
            - mysql-docker-container:mysql-docker-container
        depends_on:
            - mysql-docker-container
        ports: 
            - 8087:8080
        tty: true
        restart: always
docker-compose up --build
Dockerfile

FROM java:8
VOLUME /tmp
EXPOSE 8080
ADD app-1.0.0.jar app-1.0.0.jar
ENTRYPOINT ["java","-jar","app-1.0.0.jar"]
应用程序属性

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://mysql-docker-container:2012/database?autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=user
spring.jpa.database=database
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
logging.file=log/log.log
logging.level.org.springframework=info
logging.level.orghibernate=info
Docker桌面运行

以管理员身份打开了Git Bash

docker-machine ls
NAME  ACTIVE DRIVER  STATE     URL                       DOCKER
app    *      hyperv Running   tcp://172.18.67.35:2376   v19.03.0
在应用程序文件夹中,位于/src的位置

mvn clean install -DskipTests
BUILD SUCCESS
在应用程序文件夹中,application.propertiesapp.jardocker compose.ymlDockerfileinit.sql

version: '3.7'

services:
    mysql-docker-container:
        image: mysql
        container_name: mysql-docker-container
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=database
            - MYSQL_USER=user
            - MYSQL_PASSWORD=user
        ports:
            - 2012:3306
        tty: true

    spring-jpa-app:
        build:
            context: .
            dockerfile: Dockerfile     
        container_name: spring-jpa-app
        links:
            - mysql-docker-container:mysql-docker-container
        depends_on:
            - mysql-docker-container
        ports: 
            - 8087:8080
        tty: true
        restart: always
docker-compose up --build
邮递员

URL=

返回空,因为未加载init.sql

PD:另外,如果我以管理员身份打开一个新的git Bash并

docker ps -a

我没有让容器运行,因此我无法知道容器的ID以进入MySQL容器。

您需要添加一个卷来将sql.init复制到您的db continer:

version: '3.7'

services:
    mysql-docker-container:
        image: mysql
        container_name: mysql-docker-container
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=database
            - MYSQL_USER=user
            - MYSQL_PASSWORD=user
        ports:
            - 2012:3306
        volumes:
            - /bath/to/file/on/host/init.sql:/docker-entrypoint-initdb.d/init.sql
        tty: true
        network_mode: "host"

    spring-jpa-app:
        build:
            context: .
            dockerfile: Dockerfile     
        container_name: spring-jpa-app
        links:
            - mysql-docker-container:mysql-docker-container
        depends_on:
            - mysql-docker-container
        ports: 
            - 8087:8080
        tty: true
        restart: always
        network_mode: "host"
请参阅并搜索“初始化新实例”

另一方面,您需要使用网络来设置容器之间的连接-请参阅上面的撰写文件- 您需要将配置更改为

spring.datasource.url=jdbc:mysql://localhost:2012/database?autoReconnect=true&useSSL=false

您需要添加一个卷以将sql.init复制到db continer:

version: '3.7'

services:
    mysql-docker-container:
        image: mysql
        container_name: mysql-docker-container
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=database
            - MYSQL_USER=user
            - MYSQL_PASSWORD=user
        ports:
            - 2012:3306
        volumes:
            - /bath/to/file/on/host/init.sql:/docker-entrypoint-initdb.d/init.sql
        tty: true
        network_mode: "host"

    spring-jpa-app:
        build:
            context: .
            dockerfile: Dockerfile     
        container_name: spring-jpa-app
        links:
            - mysql-docker-container:mysql-docker-container
        depends_on:
            - mysql-docker-container
        ports: 
            - 8087:8080
        tty: true
        restart: always
        network_mode: "host"
请参阅并搜索“初始化新实例”

另一方面,您需要使用网络来设置容器之间的连接-请参阅上面的撰写文件- 您需要将配置更改为

spring.datasource.url=jdbc:mysql://localhost:2012/database?autoReconnect=true&useSSL=false

我尝试过你的建议,但效果相同,但在Postman中返回空,init.sql插入了许多数据,我的意思是它是正确的,问题不在于init.sqlI尝试过你的建议,但效果相同,但在Postman中返回空,init.sql插入了许多数据,我的意思是它是正确的,问题不在于init.sql