Dockerfile运行mysql库初始化数据失败,即MySQL–在docker-entrypoint-initdb中的MySQL脚本未被执行:

参考链接:滑动验证页面

原因是:您应该在运行容器之前清除 data_volume 并且将执行 sql 文件。 此卷 data_volume 可以使用以下命令删除: [root@localhost data]# rm -rf mysql/  --》注意:此目录是数据卷目录,即映射的宿主机持久化目录(即docker run -v /data/mysql:/var/lib/mysql->对应的/data/mysql目录),而不是容器内的目录

您的问题的根本原因可以在 docker-entrypoint.sh 中找到。当您运行 mysql 容器时,它会检查 mysql 目录 /var/lib/mysql 存在。如果该目录不存在(第一次运行),它将运行您的 SQL 文件。

关于docker-entrypoint-initdb.d下的sql脚本执行原理参考:

关于docker-entrypoint-initdb.d下的sql脚本在启动docker时没有执行原因分析_docker_一朝入魔-华为云开发者联盟

由脚本可以看出,对于docker-entrypoint-initdb.d 目录下的sql 文件,在执行前会判断DATABASE_ALREADY_EXISTS 为false
即 /data/mysql 目录并不存在-->个人总结要保证每次更新mysql的脚本数据后,清理掉这个持久化的目录但凡该服务器已经存在任何数据库,那么这个文件肯定不为空,故而不会执行sql脚本

看到源代码内容DATABASE_ALREADY_EXISTS结果为true就不执行sql脚本了

declare -g DATABASE_ALREADY_EXISTS

if [ -d "$DATADIR/mysql" ]; then

DATABASE_ALREADY_EXISTS='true'

fi

在实际开发中的操作:

[root@localhost data]# docker stop mysql

mysql

[root@localhost data]# docker rm mysql

mysql

[root@localhost data]# docker rmi 192.168.95.101:5000/zww-test/mysql:5.7.1

Untagged: 192.168.95.101:5000/zww-test/mysql:5.7.1

Deleted: sha256:0ee6264d4db55dde75ee2c330418978b20b364f40aa8b42c8fc48c9c200b42

---》先清理掉运行中的mysql容器

[root@localhost data]# rm -rf mysql/

--》然后删除数据卷映射的宿主机目录

[root@localhost data]# ls

docker-compose.yml  index.html  initsql  nginx  tomcat1  tomcat2

[root@localhost data]# cd initsql/

--》进入Dockerfile和sql文件上传所在的目录:

[root@localhost initsql]# ls

Dockerfile    tbuser.sql

[root@localhost initsql]# rm -rf tbuser.sql

[root@localhost initsql]# rz -E

rz waiting to receive.

--》上传相关sql文件和Dockerfile文件内容

/*
Navicat MySQL Data Transfer

Source Server         : test
Source Server Version : 50558
Source Host           : localhost:3306
Source Database       : test_user

Target Server Type    : MYSQL
Target Server Version : 50558
File Encoding         : 65001

Date: 2024-06-01 00:29:55
*/
CREATE DATABASE IF NOT EXISTS test_user;
use test_user;
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for tbuser
-- ----------------------------
DROP TABLE IF EXISTS `tbuser`;
CREATE TABLE `tbuser` (
  `userid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `password` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `userroles` varchar(2) COLLATE utf8_bin DEFAULT NULL,
  `nickname` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------
-- Records of tbuser
-- ----------------------------
INSERT INTO `tbuser` VALUES ('11', 'zhangsan', '123456', '1', 'woniu');

Dockerfile文件内容:

FROM mysql:5.7
# 作者信息,可以自定义
MAINTAINER mysql from date UTC by Asia/Shanghai "zhangweiwei"
ENV TZ Asia/Shanghai
COPY tbuser.sql /docker-entrypoint-initdb.d
RUN chmod +x /docker-entrypoint-initdb.d/tbuser.sql

[root@localhost initsql]# docker build -t 192.168.95.101:5000/zww-test/mysql:5.7.1 .

--》制作docker镜像

[+] Building 15.6s (8/8) FINISHED                                                                  docker:default

 => [internal] load build definition from Dockerfile                                                         0.0s

 => => transferring dockerfile: 333B                                                                         0.0s

 => [internal] load metadata for docker.io/library/mysql:5.7                                                15.3s

 => [internal] load .dockerignore                                                                            0.0s

 => => transferring context: 2B                                                                              0.0s

 => [internal] load build context                                                                            0.0s

 => => transferring context: 1.17kB                                                                          0.0s

 => [1/3] FROM docker.io/library/mysql:5.7@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a30  0.0s

 => CACHED [2/3] COPY tbuser.sql /docker-entrypoint-initdb.d                                                 0.0s

 => [3/3] RUN chmod +x /docker-entrypoint-initdb.d/tbuser.sql                                                0.2s

 => exporting to image                                                                                       0.0s

 => => exporting layers                                                                                      0.0s

 => => writing image sha256:2b3f1cc1639a24e8d2fd811f81804a4bcbbcf84cdb7880075d7197ab1504b719                 0.0s

 => => naming to 192.168.95.101:5000/zww-test/mysql:5.7.1                                                    0.0s

[root@localhost initsql]# docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -v /data/mysql:/var/lib/mysql 192.168.95.101:5000/zww-test/mysql:5.7.1 --character-set-server=utf8 --collation-server=utf8_general_ci

e0cff9f3571fa76dc546e32eb9dec96f774a33fb2f214081d278fe72ef0e72ec

--》运行mysql容器

--》登录mysql客户端,打开数据库表,观察修改解决问题后的效果如图所示,完成sql文件初始化数据。

最后检查Dockerfile设置的mysql日期,可以看到时间也是实时的:

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值