【问题标题】:Docker compose MySql initialisation scripts not executingDocker撰写MySql初始化脚本未执行
【发布时间】:2019-04-23 17:34:18
【问题描述】:

我在让 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 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

【问题讨论】:

    标签: mysql spring-boot docker docker-compose


    【解决方案1】:

    来自文档 (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" 不存在时运行。

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

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多