Docker-mysql启动时⾃动执⾏SQL
说明
在⽤docker创建mysql容器的时,有时候我们期望容器启动后数据库和表会⾃动构建,初始化数据也已⾃动录⼊,也就是说容器启动后我们就能直接连上容器中的数据库,使⽤其中的数据了。⾃动执⾏SQL这⼀过程存在于第⼀次使⽤镜像构建容器时,下⼀次restart容器时则不会存在等待其再次⾃动执⾏SQL的过程。
其实mysql的官⽅镜像是⽀持这个能⼒的,在容器启动的时候⾃动执⾏指定的sql脚本或者shell脚本,我们⼀起来看看MySQL官⽅的,如下图:
注意事项:官⽅加载该sh⽂件时指定了名字,也就是说,我们的sql启动脚本sh⽂件也得叫这个名字:docker-entrypoint.sh
快速开始
⾸先给出项⽬结构图(使⽤IDEA):
⾸先给出SQL⽂件,⼀个创建数据库和表sakila-schema.sql,⼀个写⼊数据sakila-data.sql:
必需脂肪酸CREATE DATABASE `persontest` CHARACTER SET 'utf8';
use persontest;
CREATE TABLE `persontest`.`userinfo` (
`id` int(0) NOT NULL,
`username` varchar(255) NULL,
PRIMARY KEY (`id`)
);
INSERT INTO userinfo(id,username) VALUES(0,'CSDN yunlingfly');
INSERT INTO userinfo(id,username) VALUES(1,'dakl');
INSERT INTO userinfo(id,username) VALUES(2,'dhasjk');
创建docker-entrypoint.sh写⼊我们需要⾃动执⾏的SQL⽂件位置:
个人档案查询docker-entrypoint.sh:
#!/bin/bash
mysql -uroot -proot <<EOF
source /usr/local/sakila-schema.sql;
source /usr/local/sakila-data.sql;
然后我们需要基于官⽅MySQL(官⽅镜像拉取太慢,这⾥我⽤的其他的镜像)构建⼀个⾃⼰的MySQL镜像,并在Dockerfile⽂件中将本地的SQL⽂件拷贝到镜像⾥去和指定⼀系列参数:
Dockerfile:
2022放假安排# 这个是构建MySQL的dockerfile
FROM registry.saas.hand-china/tools/mysql:5.7.17
# mysql的⼯作位置
ENV WORK_PATH /usr/local/
# 定义会被容器⾃动执⾏的⽬录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
# 初始化数据库的SQL
ENV FILE_0 sakila-schema.sql
ENV FILE_1 sakila-data.sql
# 执⾏SQL
ENV INSTALL_DATA_SHELL docker-entrypoint.sh
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $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
# 设置容器启动时执⾏的命令
双鱼座的性格#CMD ["sh", "/docker-entrypoint-initdb.d/import.sh"]
编写⼀个启动脚本build.sh:
build.sh:
echo "开始打包..."
# 制作镜像:[TAG]
docker build -t mymysql:test ./mysql
编写⼀个开启容器的脚本start.sh:
start.sh:
#!/usr/bin/env bash
# Compose 是⼀个⽤户定义和运⾏多个容器的 Docker 应⽤程序。
# 在 Compose 中你可以使⽤ YAML ⽂件来配置你的应⽤服务。
# 然后,只需要⼀个简单的命令,就可以创建并启动你配置的所有服务。
docker-compose up
编写docker-compose(这⾥我们才⽤了⼀个镜像,其实直接在脚本⽂件⾥写执⾏命令也⾏,有些⼤材⼩⽤,以后再写怎么使⽤docker-compose同时启动多个容器),注意docker-compose⾥不要写中⽂,注释可以写使⽤(例如# sometest),但不能⽤中⽂注释,否则会报错:最流行的短发发型
version: "2"
services:
mymysql:
image: mymysql:test
container_name: mymysql
ports:
- "3306:3306"
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
environment:
MYSQL_ROOT_PASSWORD: "root"
运⾏结果
1 打开git bash,进⼊项⽬根⽬录,输⼊
$ ./build.sh
$ ./start.sh
差不多30s可以启动完成,另起⼀个bash输⼊docker logs mymysql看到如下说明启动完成:
使⽤Navicat测试是否成功导⼊数据,192.168.99.100这个IP是docker启动分配的默认IP,密码为设置的root:
已成功导⼊~
注意事项:如果出现中⽂乱码,可能是数据库的原因,也可能是docker镜像没有中⽂⽀持,这⾥不说明怎么调整了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论