自定义mysql docker镜像实操

网上对于自定义mysql docker镜像的相关文章都很乱而且很多都是错误的, 在自己琢磨了几个小时后,实现了自己的需求,用这篇文章记录自己操作的过程以便日后查阅,也希望能帮到需要的同学。

需求

  • 创建一个mysql数据库容器
  • 容器自动初始化并且配置好用户名以及密码
  • 容器自动创建数据库和数据表

所需文件

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
 

其中Dockerfile_mysql内容为:

  1. FROM mysql:5.7
  2. COPY install_data.sh /docker-entrypoint-initdb.d/install_data.sh
  3. COPY init_database.sql /opt/init_database.sql
  4. #mysql version >= 5.7
  5. COPY mysql.cnf /etc/mysql/conf.d/mysql.cnf
  6. 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 the mysql 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内容为:

  1. #!/bin/bash
  2.  
  3. mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
  4. source /opt/init_database.sql
  5. exit
  6. EOF

说明:

  • 第3行 表示用root账户登录mysql数据库,$MYSQL_ROOT_PASSWORD这个为mysql镜像的环境变量,表示启动docker容器时候设置的root密码,用<<EOF表示接下来的内容是在登录mysql之后输入的内容,并以EOF结尾
  • 第4行 执行sql脚本(对数据库的一系列操作都在这个文件里面进行)

 

init_database.sql内容为:

  1. ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
  2. CREATE USER 'user_name'@'%' IDENTIFIED WITH mysql_native_password BY 'your_psw';
  3. GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'%';
  4.  
  5. SET FOREIGN_KEY_CHECKS = 0;
  6.  
  7. DROP DATABASE IF EXISTS test;
  8. CREATE DATABASE test;
  9. USE test;
  10.  
  11. DROP TABLE IF EXISTS `TestTable`;
  12. CREATE TABLE `TestTable` (
  13.   `id`        int(64) NOT NULL AUTO_INCREMENT,
  14.   `text`      varchar(20)          DEFAULT NULL,
  15.   `info`      varchar(512)          DEFAULT NULL,
  16.   `timestamp` datetime         DEFAULT NULL,
  17.   PRIMARY KEY (`id`)
  18. )
  19.   ENGINE = InnoDB
  20.   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密码一致

 

到这里就大功告成啦!!!

 

 

 

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值