让docker中的mysql启动时自动执行sql

在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了。

其实mysql的官方镜像是支持这个能力的,在容器启动的时候自动执行指定的sql脚本或者shell脚本,我们一起来看看mysql官方镜像的Dockerfile,如下图:

这里写图片描述

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

这里写图片描述

搞清楚原理了,现在我们来实践一次吧:

在docker上搭建disconf环境时,需要搭建mysql数据库,并且要依次执行四个sql文件分别对数据库,表,数据做初始化,我们有两种做法:

  1. 将四个sql文件复制到/docker-entrypoint-initdb.d目录下,这样容器run的时候的时候就会自动执行这四个sql,但是从截图的脚本上来看,对多个文件中的执行顺序是不能指定的,如果创建数据库的脚本晚于创建表的脚本执行,那么就会导致建表失败,所以这种复制sql的方式不能满足我们的需要(不过,如果将四个文件按照顺序合成一个sql就能满足要求了);
  2. 做一个sh文件,在里面按我们自己的需要来执行sql,内容如下:
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $WORK_PATH/$FILE_0;
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2; 
source $WORK_PATH/$FILE_3; 

看得出shell很简单,登录mysql并执行指定的sql文件,MYSQL_ROOT_PASSWORD,WORK_PATH,FILE_0这些都是环境变量。

再来看看对应的Dockerfile怎么写,如下:

# Docker image of disconf mysql
# VERSION 0.0.1
# Author: bolingcavalry

#基础镜像使用daocloud.io/library/mysql:8
FROM daocloud.io/library/mysql:8

#作者
MAINTAINER BolingCavalry <zq2599@gmail.com>

#定义工作目录
ENV WORK_PATH /usr/local/work

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

#定义sql文件名
ENV FILE_0 0-init_table.sql
ENV FILE_1 1-init_data.sql
ENV FILE_2 20151225.sql
ENV FILE_3 20160701.sql

#定义shell文件名
ENV INSTALL_DATA_SHELL install_data.sh

#创建文件夹
RUN mkdir -p $WORK_PATH

#把数据库初始化数据的文件复制到工作目录下
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/
COPY ./$FILE_2 $WORK_PATH/
COPY ./$FILE_3 $WORK_PATH/

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

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

0-init_table.sql,1-init_data.sql,20151225.sql,20160701.sql这四个文件就是我们要执行的sql,在构造docker镜像的时候被复制到镜像文件中了;

完整内容请clone我的github:git@github.com:zq2599/docker_disconf.git,clone完毕后进入里面的mysql文件夹,在此文件夹下执行命令行docker build -t disconf_mysql:0.0.1 .构建镜像;

再执行docker run –name mysqldisconf -e MYSQL_ROOT_PASSWORD=123456 -idt disconf_mysql:0.0.1启动一个容器,再执行docker logs -f mysqldisconf查看容器日志,如下图红框,可以看到我们写入指定位置的sh文件已经被执行了:

这里写图片描述

我们去数据库里看看数据是不是真的有了,执行docker exec -it mysqldisconf /bin/bash进入容器;

执行mysql -uroot -p123456登录mysql后,操作如下图:

这里写图片描述

可以看到,show databases,show tables,select * from app等操作都可以证明sql已经在容器创建后被自动执行,达到了我们的目的。

欢迎关注我的公众号

在这里插入图片描述

### 如何在 Docker 中安装 MySQL 并设置其自动启动 要在 Docker 中安装 MySQL 并将其配置为开机自动启动,可以按照以下方式操作: #### 1. 安装 DockerMySQL 确保已正确安装 Docker。如果尚未安装,请先完成 Docker 的安装过程。 通过运行以下命令来拉取官方的 MySQL 镜像: ```bash docker pull mysql:latest ``` 创建并启动一个新的 MySQL 容器时,可以通过 `--restart` 参数指定容器的重启策略[^4]。例如,使用 `unless-stopped` 策略表示除非手动停止该容器,否则它将在系统重新启动后自动启动。 ```bash docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d --restart unless-stopped mysql:latest ``` #### 2. 对于已有容器启用自动启动 如果已经有一个正在运行的 MySQL 容器,则可以直接更新它的重启策略以实现自动启动功能: ```bash docker update --restart unless-stopped my-mysql ``` #### 3. 设置 Docker 自身的开机自启 (适用于 Linux) 为了使上述设置生效,还需要保证 Docker 服务本身能够在操作系统启动时被激活。这通常涉及对系统的初始化脚本进行调整。对于基于 systemd 的发行版(如 Ubuntu),可执行如下命令来启用 Docker 的开机自启[^3]: ```bash systemctl enable docker ``` #### 4. 进一步优化与安全措施 - **端口映射**: 若要让外部设备能够访问此数据库实例,记得将主机上的某个端口号绑定至容器内部的服务端口(默认情况下为3306)[^3]。例如,在启动新容器的时候加入 `-p 3306:3306` 参数。 - **字符集设定**: 推荐进入 MySQL 控制台并通过 SQL 命令更改客户端和服务端之间的通信编码格式为 UTF-8 ,从而避免因区域差异引发的数据乱码现象 。 可采用单条语句形式简化处理流程:`SET NAMES 'utf8';`. --- ### 示例代码片段 以下是完整的示例脚本用于快速部署具有持久化存储支持以及适当参数配置的一个 MySQL 实例,并且设置了合理的重启行为: ```bash #!/bin/bash # 创建数据卷目录 mkdir -p /data/mysql # 启动带持久化的 MySQL 容器 docker run \ --name=mysql-server \ -v /data/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=rootpasswordhere \ -p 3306:3306 \ --restart=always \ -d mysql:latest ``` ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员欣宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值