docker编写mysql初始化脚本未执行

kcrjzv8t  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(555)

我在使用mysql容器运行初始化脚本时遇到问题。
我有两份档案 create.sql 以及 insert.sql ,我用它初始化数据库。
我使用命令创建图像 docker-compose.yml 它成功运行并创建图像。
我面临两个问题。
当我运行 docker-compose up 命令,mysql容器创建并启动成功。但是两个初始化脚本( create.sql 以及 insert.sql )不要在数据库上运行。
我明确使用 docker run 命令来运行创建的mysql容器。在这种情况下,初始化脚本将成功运行。
我使用的是DockerVersion18.09.0和DockerComposeVersion1.23.1以及Ubuntu16.04 lts
我是 Docker 的新手,似乎不知道这个问题。
下面是我用来创建图像的文件。 docker-compose.yml 文件。

version: '3'

services:
  demo-mysql:
    image: demo-mysql
    build: ./demo-mysql
    volumes:
      - /mnt/data/mysql-data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=demo
      - MYSQL_PASSWORD=root

  demo-api:
    image: demo-api-1.0
    build: ./api
    depends_on:
      - demo-mysql
    ports:
      - 8080:8080
    environment:
      - DATABASE_HOST=demo-mysql
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=demo
      - DATABASE_PORT=3306

  demo1-app:
    image: demo1-app-1.0
    build: ./demo1
    depends_on:
      - demo-mysql
    ports:
      - 8090:8090
    environment:
      - DATABASE_HOST=demo-mysql
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=demo
      - DATABASE_PORT=3306

以下是 Dockerfile 对于spring boot项目

FROM java:8

VOLUME /tmp

ARG DATA_PATH=/src/main/resources
ARG APP_PORT=8080

EXPOSE ${APP_PORT}

ADD /build/libs/demo-api.jar demo-api.jar

ENTRYPOINT ["java","-jar","demo-api.jar"]

以下是 Dockerfile 我曾经创建我的mysql图像

FROM mysql:5.7

ENV MYSQL_DATABASE=demo \
    MYSQL_USER=root \
    MYSQL_ROOT_PASSWORD=root

ADD ./1.0/create.sql /docker-entrypoint-initdb.d
ADD ./1.0/insert.sql /docker-entrypoint-initdb.d

EXPOSE 3306
gopyfrb3

gopyfrb31#

来自文档(https://hub.docker.com/_/mysql/)
初始化新示例
当容器第一次启动时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为.sh、.sql和.sql.gz的文件,这些文件位于/docker entrypoint initdb.d中。
我怀疑,因为持续的卷

volumes:
      - /mnt/data/mysql-data:/var/lib/mysql

当docker启动mysql映像时,已经有一个db。所以图像不是“新鲜的”,脚本也没有运行。
更新:我们可以确认这个嫌疑犯正在查看 docker-entrypoint.sh 在这里:https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/5.7/docker-entrypoint.sh

if [ ! -d "$DATADIR/mysql" ]; then
...
...
        ls /docker-entrypoint-initdb.d/ > /dev/null
        for f in /docker-entrypoint-initdb.d/*; do
            process_init_file "$f" "${mysql[@]}"
        done

脚本仅在 "$DATADIR/mysql" 已不存在。
顺便说一句,我个人认为更好的设计是让“应用程序”创建数据库模式、预加载所需的应用程序数据、管理模式迁移等。。。在启动时,这是另一个主题:)

相关问题