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

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

我在使用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 文件。

  1. version: '3'
  2. services:
  3. demo-mysql:
  4. image: demo-mysql
  5. build: ./demo-mysql
  6. volumes:
  7. - /mnt/data/mysql-data:/var/lib/mysql
  8. ports:
  9. - 3306:3306
  10. environment:
  11. - MYSQL_ROOT_PASSWORD=root
  12. - MYSQL_DATABASE=demo
  13. - MYSQL_PASSWORD=root
  14. demo-api:
  15. image: demo-api-1.0
  16. build: ./api
  17. depends_on:
  18. - demo-mysql
  19. ports:
  20. - 8080:8080
  21. environment:
  22. - DATABASE_HOST=demo-mysql
  23. - DATABASE_USER=root
  24. - DATABASE_PASSWORD=root
  25. - DATABASE_NAME=demo
  26. - DATABASE_PORT=3306
  27. demo1-app:
  28. image: demo1-app-1.0
  29. build: ./demo1
  30. depends_on:
  31. - demo-mysql
  32. ports:
  33. - 8090:8090
  34. environment:
  35. - DATABASE_HOST=demo-mysql
  36. - DATABASE_USER=root
  37. - DATABASE_PASSWORD=root
  38. - DATABASE_NAME=demo
  39. - DATABASE_PORT=3306

以下是 Dockerfile 对于spring boot项目

  1. FROM java:8
  2. VOLUME /tmp
  3. ARG DATA_PATH=/src/main/resources
  4. ARG APP_PORT=8080
  5. EXPOSE ${APP_PORT}
  6. ADD /build/libs/demo-api.jar demo-api.jar
  7. ENTRYPOINT ["java","-jar","demo-api.jar"]

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

  1. FROM mysql:5.7
  2. ENV MYSQL_DATABASE=demo \
  3. MYSQL_USER=root \
  4. MYSQL_ROOT_PASSWORD=root
  5. ADD ./1.0/create.sql /docker-entrypoint-initdb.d
  6. ADD ./1.0/insert.sql /docker-entrypoint-initdb.d
  7. EXPOSE 3306
gopyfrb3

gopyfrb31#

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

  1. volumes:
  2. - /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

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

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

展开查看全部

相关问题