网上对于自定义mysql docker镜像的相关文章都很乱而且很多都是错误的, 在自己琢磨了几个小时后,实现了自己的需求,用这篇文章记录自己操作的过程以便日后查阅,也希望能帮到需要的同学。
需求
- 创建一个mysql数据库容器
- 容器自动初始化并且配置好用户名以及密码
- 容器自动创建数据库和数据表
所需文件
其中Dockerfile_mysql内容为:
- FROM mysql:5.7
- COPY install_data.sh /docker-entrypoint-initdb.d/install_data.sh
- COPY init_database.sql /opt/init_database.sql
- #mysql version >= 5.7
- COPY mysql.cnf /etc/mysql/conf.d/mysql.cnf
- RUN chmod 644 /etc/mysql/conf.d/mysql.cnf
说明:
- 第2行 表示把需要在mysql容器初始化完成后执行的脚本放到/docker-entrypoint-initdb.d目录下,这个脚步会自动运行
- 第3行 表示把需要执行的sql脚本放到容器的/opt目录下,在install_data.sh里面会调用
- 第5行 表示将自定义的mysql脚本放到mysql的自定义配置目录,这来源于mysql的docker镜像官方说明:
The default configuration for MySQL can be found in
/etc/mysql/my.cnf
, which may!includedir
additional directories such as/etc/mysql/conf.d
or/etc/mysql/mysql.conf.d
. Please inspect the relevant files and directories within themysql
image itself for more details.
表示只要是.cnf结尾的自定义配置文件都可以放到/etc/mysql/conf.d目录下,里面的配置会覆盖默认配置
- 第6行 这一步很关键,必须要将配置文件设置成644的文件权限,不然mysql运行时候回忽略这个配置:
[Warning] World-writable config file '/etc/mysql/conf.d/mysql.cnf' is ignored.
install_data.sh内容为:
- #!/bin/bash
- mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
- source /opt/init_database.sql
- exit
- EOF
说明:
- 第3行 表示用root账户登录mysql数据库,$MYSQL_ROOT_PASSWORD这个为mysql镜像的环境变量,表示启动docker容器时候设置的root密码,用<<EOF表示接下来的内容是在登录mysql之后输入的内容,并以EOF结尾
- 第4行 执行sql脚本(对数据库的一系列操作都在这个文件里面进行)
init_database.sql内容为:
- ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
- CREATE USER 'user_name'@'%' IDENTIFIED WITH mysql_native_password BY 'your_psw';
- GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'%';
- SET FOREIGN_KEY_CHECKS = 0;
- DROP DATABASE IF EXISTS test;
- CREATE DATABASE test;
- USE test;
- DROP TABLE IF EXISTS `TestTable`;
- CREATE TABLE `TestTable` (
- `id` int(64) NOT NULL AUTO_INCREMENT,
- `text` varchar(20) DEFAULT NULL,
- `info` varchar(512) DEFAULT NULL,
- `timestamp` datetime DEFAULT NULL,
- PRIMARY KEY (`id`)
- )
- ENGINE = InnoDB
- DEFAULT CHARSET = utf8mb4;
说明:
- 第1行 用root账户登录,需要注意的是:这里的密码123456必须要和启动容器时候设置的密码一致,否则会出错
- 第2、3行 添加远程用户并给与权限
- 第7、8行 创建数据库
- 第11-20行 创建数据表
mysql.cnf内容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
主要是设置字符为utf8,避免出现中文乱码的问题
打包生成镜像
$ docker build -f Dockerfile_mysql -t testmysql:0.01 .
运行生成的镜像
$ docker run -it --name mysqltest -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 testmysql:0.01
这里的MYSQL_ROOT_PASSWORD=123456 密码需要和sql里面的root密码一致
到这里就大功告成啦!!!