Docker(五)、启动mysql时自动执行脚本

docker 启动mysql时自动执行脚本

上次已经运行了一个 tomcat 我们还需要一个数据库,docker 运行一个mysql 是很简单的比如
docker run -d --name testmysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=admin mysql
  • MYSQL_ROOT_PASSWORD=root,指定 root 用户名密码 root
  • MYSQL_DATABASE=admin 容器运行时创建一个数据库名为 admin
    但是这样只能获得一个空的数据库,我们需要有数据的数据库,so
其实mysql的官方镜像是支持这个能力的,在容器启动的时候自动执行指定的sql脚本或者shell脚本,我们一起来看看mysql官方镜像的Dockerfile,如下图:

这里写图片描述

已经设定了ENTRYPOINT,里面会调用/entrypoint.sh这个脚本,我们把镜像pull到本地,再用docker run启动起来,进入容器看看里面的entrypoint.sh这个脚本的内容,有一段内容就是从固定目录下遍历所有的.sh和.sql后缀的文件,然后执行,如下图:

这里写图片描述

搞清楚原理了,现在我们来实战吧

一、创建 Dockerfile 文件

# mysql 官方镜像
FROM docker.io/mysql

#作者
MAINTAINER rstyro <rstyro@gmail.com>

#定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#定义初始化sql文件
ENV INIT_SQL admin.sql

#把要执行的sql文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个sql
COPY ./$INIT_SQL $AUTO_RUN_DIR/

#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INIT_SQL

二、admin.sql 文件

DROP DATABASE IF EXISTS `admin`;
CREATE DATABASE `admin` character set utf8mb4;
USE `admin`;

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `sys_login`
-- ----------------------------
DROP TABLE IF EXISTS `sys_login`;
CREATE TABLE `sys_login` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `last_login_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后登录时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8mb4;


-- ----------------------------
-- Table structure for `sys_menu`
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
  `menu_id` int(11) NOT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `menu_name` varchar(50) DEFAULT NULL,
  `menu_url` varchar(50) DEFAULT '#',
  `menu_type` enum('2','1') DEFAULT '2' COMMENT '1 -- 系统菜单,2 -- 业务菜单',
  `menu_icon` varchar(50) DEFAULT '#',
  `sort_num` int(11) DEFAULT '1',
  `user_id` int(11) DEFAULT '1' COMMENT '创建这个菜单的用户id',
  `is_del` int(11) DEFAULT '0' COMMENT '1-- 删除状态,0 -- 正常',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of sys_menu
-- ----------------------------
INSERT INTO `sys_menu` VALUES ('1', '0', '系统管理', '#', '1', 'fa fa-gears', '1', '1', '0', '2017-09-08 16:15:24', '2017-09-07 14:52:41');
INSERT INTO `sys_menu` VALUES ('2', '1', '菜单管理', 'menu/list', '1', '#', '1', '1', '0', '2017-09-12 11:28:09', '2017-09-07 14:52:41');
INSERT INTO `sys_menu` VALUES ('3', '1', '角色管理', 'role/list', '1', null, '2', '1', '0', '2017-09-07 17:58:52', '2017-09-07 14:52:41');
INSERT INTO `sys_menu` VALUES ('4', '1', '用户管理', 'user/list', '1', '', '3', '1', '0', '2017-09-12 09:44:48', '2017-09-07 14:52:41');
INSERT INTO `sys_menu` VALUES ('5', '0', '业务菜单', '#', '2', 'fa fa-tasks', '2', '1', '0', '2017-09-07 14:53:33', '2017-09-07 14:52:41');
INSERT INTO `sys_menu` VALUES ('6', '5', '随便添加的子菜单', 'page/t4', '2', '', '1', '1', '0', '2017-09-14 15:45:28', '2017-09-07 14:52:41');

-- ----------------------------
-- Table structure for `sys_role`
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(50) DEFAULT NULL COMMENT '角色名',
  `role_desc` varchar(255) DEFAULT NULL,
  `rights` varchar(255) DEFAULT '0' COMMENT '最大权限的值',
  `add_qx` varchar(255) DEFAULT '0',
  `del_qx` varchar(255) DEFAULT '0',
  `edit_qx` varchar(255) DEFAULT '0',
  `query_qx` varchar(255) DEFAULT '0',
  `user_id` varchar(10) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES ('1', '管理员', '管理员权限', '1267650600228229401496703205375', '1', '1', '126', '126', '1', '2017-09-12 15:38:56');
INSERT INTO `sys_role` VALUES ('2', 'tyro', '随便创建的随便创建的随便创建的随便创建的随便创建的随便创建的随便创建的随便创建的随便创建的随便创建的', '94', '2', '1', '4', '126', '1', '2017-09-12 15:44:06');
INSERT INTO `sys_role` VALUES ('3', 'test', '是测试角色这个是测试角色这个是测试角色这个是测试角色这个是测试角色', '382', '382', '382', '382', '126', '1', '2017-09-12 15:39:28');
INSERT INTO `sys_role` VALUES ('4', '查看', '可以查看所有的东西', '126', '0', '0', '0', '126', '1', '2017-09-14 17:17:17');

-- ----------------------------
-- Table structure for `sys_user`
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `nick_name` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `pic_path` varchar(200) DEFAULT '/images/logo.png',
  `status` enum('unlock','lock') DEFAULT 'unlock',
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES ('1', 'admin', '管理员', 'd033e22ae348aeb5660fc2140aec35850c4da997', 'http://www.lrshuai.top/upload/user/20170612/05976238.png', 'unlock', '2017-08-18 13:57:32');
INSERT INTO `sys_user` VALUES ('2', 'tyro', 'tyro', '481c63e8b904bb8399f1fc1dfdb77cb40842eb6f', '/upload/show/user/82197046.png', 'unlock', '2017-09-12 14:03:39');
INSERT INTO `sys_user` VALUES ('3', 'asdf', 'asdf', '3da541559918a808c2402bba5012f6c60b27661c', '/upload/show/user/85610497.png', 'unlock', '2017-09-13 14:49:10');

-- ----------------------------
-- Table structure for `sys_user_role`
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `role_id` int(11) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of sys_user_role
-- ----------------------------
INSERT INTO `sys_user_role` VALUES ('1', '1', '1', '2017-08-18 14:45:43');
INSERT INTO `sys_user_role` VALUES ('2', '2', '3', '2017-09-08 17:12:58');
INSERT INTO `sys_user_role` VALUES ('13', '3', '3', '2017-09-14 14:30:02');

三、生成新的mysql镜像

docker build -t adminmysql .

四、启动

现在启动是可以的,但是呢有一个问题,因为mysql的编码默认是瑞典latin1,我们要把改成utf8 或者utfmb4
my.cnf
[mysqld]
character_set_server=utf8mb4
init_connect='SET NAMES utf8'
wait_timeout=1814400
interactive_timeout=604800

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
default-character-set=utf8mb4
上面的配置就和mysql 的配置是一样的,可以按照你的需求来配,下面就是启动容器的命令
# 默认密码: root,我们要挂载一个my.cnf 的配置文件
docker run --name admin_db -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -v /root/docker-mysql/my.cnf:/etc/mysql/my.cnf adminmysql

查看容器数据库是否有数据

这里写图片描述

不错是有数据的。

我的命令过程
这里写图片描述

搞定收工

参考链接:https://blog.csdn.net/boling_cavalry/article/details/71055159

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 如果你想在启动MySQL Docker容器执行一些初始化的SQL脚本,可以通过在容器启动挂载一个包含脚本的目录,并在Dockerfile中使用ENTRYPOINT命令来指定执行脚本的命令。 首先,确保你已经安装了DockerDocker Compose。如果你使用的是Docker Desktop,那么你不需要额外安装Docker Compose。然后,你可以从GitHub上下载对应版本的Docker Compose。 接下来,你需要选择MySQL版本为8.0的Docker镜像。你可以使用以下命令来启动一个MySQL容器,并指定root用户的密码和创建的数据库名: ``` docker run -d --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=admin mysql:8.0 ``` 这样会创建一个名为admin的数据库,但是它是一个空的数据库。如果你想在容器启动自动执行指定的SQL脚本,你可以将这些脚本放在一个目录中,并将该目录挂载到容器中。例如,你可以将脚本放在一个名为`init-scripts`的目录中。 然后,你可以使用以下的Docker Compose文件来定义你的MySQL容器,并在该文件中指定挂载的目录和执行脚本的命令: ```yaml version: '3' services: mysql: image: mysql:8.0 ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: admin volumes: - ./init-scripts:/docker-entrypoint-initdb.d ``` 在这个例子中,我们将`./init-scripts`目录挂载到容器的`/docker-entrypoint-initdb.d`目录中,这是MySQL官方镜像中用于执行初始化脚本的目录。你可以将你的初始化SQL脚本放在`./init-scripts`目录中,并在容器启动自动执行。 希望这能帮到你。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [docker容器启动Mysql执行初始化sql脚本实现](https://blog.csdn.net/Allocator/article/details/117092356)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Docker)、启动mysql自动执行脚本](https://blog.csdn.net/qq_32923745/article/details/80817477)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值