docker:mysql启动时自动执行初始建表脚本

本文介绍如何通过Docker自动创建MySQL数据库及表,并加载初始化数据,实现容器启动即用。通过在/docker-entrypoint-initdb.d目录放置SQL脚本,利用MySQL官方镜像特性,简化部署流程。

默认情况下,mysql镜像创建的docker容器启动时只是一个空的数据库实例,为了简化docker部署,我们需要
在docker创建mysql容器的时,数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后数据库就可用了。这就需要容器启动时能自动执行sql脚本。
在mysql官方镜像中提供了容器启动时自动执行/docker-entrypoint-initdb.d文件夹下的脚本的功能(包括shell脚本和sql脚本)
docker-entrypoint.sh中下面这段代码就是干这事儿的

		for f in /docker-entrypoint-initdb.d/*; do
			case "$f" in
				*.sh)     echo "$0: running $f"; . "$f" ;;
				*.sql)    echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;;
				*.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;
				*)        echo "$0: ignoring $f" ;;
			esac
			echo
		done

也就是说只要把你自己的初始化脚本放到/docker-entrypoint-initdb.d/文件夹下就齐活了。

于是可以做这样一个简单的Dockerfile来实例我们的需求,其实关键的代码就是最后一行了。

Dockerfile

# docker image of facelog mysql
# version 1.0.0
# author guyadong
FROM mysql:5.6
MAINTAINER guyadong(10km0811@sohu.com)
# 复制数据库初始化脚本create_table.sql到/docker-entrypoint-initdb.d文件夹下
COPY sql/create_table.sql /docker-entrypoint-initdb.d

参考资料

mysql 5.6 entrypoint 脚本 https://github.com/docker-library/mysql/blob/master/5.6/docker-entrypoint.sh
mysql 5.6 镜像脚本 https://github.com/docker-library/mysql/blob/master/5.6/Dockerfile

可以使用以下几种方式来实现使用 Docker。 ### 使用 Docker Compose 的 command 字段 可以使用 Docker Compose 的 `command` 字段来在动数据库容器时执行命令。示例如下: ```yaml version: '3' services: database: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: mydatabase command: bash -c "mysql -u root -prootpassword mydatabase < /db-scripts/create-tables.sql" ``` 在这个示例中,当容器启动时,会执行 `/db-scripts/create-tables.sql` 文件中的 SQL 脚本来创 [^2]。 ### 使用 Dockerfile 复制初始化脚本Dockerfile 中从官方的 MySQL 镜像开始构,并将初始化 SQL 文件复制到 `/docker-entrypoint-initdb.d` 目录下,当 MySQL 容器启动时,会自动运行这个目录下的所有脚本。示例 Dockerfile 如下: ```Dockerfile FROM mysql:5.7 # 设置环境变量 ENV MYSQL_ROOT_PASSWORD rootpass ENV MYSQL_DATABASE mydb ENV MYSQL_USER myuser ENV MYSQL_PASSWORD mypass # 复制 init.sql 文件到/docker-entrypoint-initdb.d 目录下 COPY init.sql /docker-entrypoint-initdb.d ``` 这里的 `init.sql` 文件包含创的 SQL 语句,例如: ```sql -- 创一个名为 users 的 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT ); ``` 容器启动时,会自动执行 `init.sql` 中的语句 [^4]。 ### 另一个 Dockerfile 示例 ```Dockerfile # docker image of facelog mysql # version 1.0.0 # author guyadong FROM mysql:5.6 MAINTAINER guyadong(10km0811@sohu.com) # 复制数据库初始化脚本create_table.sql到/docker-entrypoint-initdb.d文件夹下 COPY sql/create_table.sql /docker-entrypoint-initdb.d ``` 该 Dockerfile 同样是将 `create_table.sql` 复制到 `/docker-entrypoint-initdb.d` 目录,容器启动时执行操作 [^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

10km

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

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

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

打赏作者

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

抵扣说明:

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

余额充值