Dockerfile运行mysql库初始化数据失败,即MySQL–在docker-entrypoint-initd ...

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

参考链接:滑动验证页面
原因是:您应该在运行容器之前清除 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日期,可以看到时间也是及时的:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表