mysql - Docker 撰写 MySql 初始化脚本不执行

标签 mysql spring-boot docker docker-compose

我在使用 mysql 容器运行我的初始化脚本时遇到问题。

我有两个文件 create.sqlinsert.sql,我用它们来初始化数据库.

我使用命令 docker-compose.yml 创建图像,它成功运行并创建了图像。

我面临两个问题。

  1. 当我运行 docker-compose up 命令时,成功创建并启动了 mysql 容器。但是,两个初始化脚本(create.sqlinsert.sql)不会在数据库上运行。

  2. 我明确使用 docker run 命令来运行创建的 mysql 容器。在这种情况下,初始化脚本运行成功

我正在使用 Docker 版本 18.09.0docker-compose 版本 1.23.1 和 ubuntu < strong>16.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

下面是spring boot项目的Dockerfile

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

以下是我用来创建mysql镜像的Dockerfile

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

最佳答案

来自文档 ( https://hub.docker.com/_/mysql/ )

Initializing a fresh instance

When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /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" 不存在时运行。

顺便说一句,我个人认为更好的设计是让“应用程序”创建数据库模式、预加载所需的应用程序数据、管理模式迁移等...在启动时,但这是另一个主题:)

关于mysql - Docker 撰写 MySql 初始化脚本不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407147/

相关文章:

java - 使用 Spring Boot 和 JPA 的未识别 SQL 错误语法

Docker RUN 命令 : When To Group Commands, 什么时候不?

php - 带有预准备语句的 Zend db 无法获取所有数据

mysql - 非规范化与子/父和嵌套

php - 插入特定值更改记录

java - 如何在运行时切换 Spring 配置文件?

c# - 从多个 sql 表 Entity Framework web api 返回数据

java - 在内存 DB 中的 H2 中插入日期时 DateTimeFormat 无效

docker build 忽略存储在我的卷中的现有数据和数据库配置

docker - 正常构建时如何忽略docker buildkit标志