目前我所使用的两种方式:
通过dockerfile创建镜像和容器转镜像
dockerfile创建镜像:
FROM mysql:5.6.47 as builder
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_DATABASE=root
# .sql文件可替换成对应库的SQL文件,文件路径可使用相对路径和绝对路径
COPY mysql.sql /docker-entrypoint-initdb.d/
COPY ./mycustom.cnf /etc/mysql/conf.d/custom.cnf
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]
FROM mysql:5.6.47
COPY --from=builder /initialized-db /var/lib/mysql
dockerfile 初始化流程大致是先创mysql原始容器,在执行对应的sql文件创建数据库,而容器制作的镜像它在创建容器后就已经带有数据库了不需要再执行sql文件,当sql文件有几百M甚至G的时候容器镜像创建会特别快
容器转镜像:
通过已有的mysql容器制作镜像 因为mysql容器制作镜像时默认配置是不会把已有的数据也打包进镜像,所以如果只是单纯的容器转镜像,制作的镜像再转容器是不会带有数据的,可以参考以下方法:
整体逻辑就是自己创建的数据文件在另一个地方,打包的时候mysql配置文件 datadir 路径指向的是默认地址,所以只要把datadir 路径改成你自己数据库存放的路径就可以了。
1、在修改mysql容器 中的 新建目录 mdkir /workdir 这个地址可以随意。
2、 将 /var/lib/mysql 这个文件就存放着数据库文件 把这个复制 到新建目录中。
3、 修改 /etc/mysql/my.cnf 这个配置文件根据mysql不同可能会有所区别,主要就是找到一个有 “datadir =”配置的文件,将原来指向的地址改成你新建的地址
datadir = /workdir/mysql
因为 docker容器可能不存在vi或vim命令可以使用像sed命名等可以修改文件的命令
假如用sed命令注意路径转义 “/”
4、修改后退出 重启 容器就生效。
最后在执行 docker 容器转镜像命令
docker commit 容器id 镜像名:版本
结束