将数据的初始化放到docker中的整个工作过程(问题记录)

由于是打算作为个人博客,所以对于install这个步骤,我从一开始就打算删掉的,前面一个多星期一直在修bug,到前天才开始做这个事情.

过程中也是碰到了各种问题,花了整整三天时间才完整的解决并实现了这个过程.

1.首先是思路的整理,如何去实现install过程的docker化.

由于原来是直接用的mysql5.7官方镜像,所以mysql数据的导入就不好实现,因此需要在原官方镜像的基础上重新创建镜像

实现方法及所需文件都在在mysql文件夹下.

2.数据导入与mysql权限问题.

设想是通过shell脚本来实现数据导入工作,用了好几种方法都无法绕过mysql的认证步骤.

通过shell脚本对mysql进行操作时是无法实现输入密码,因此用了最不安全的方法,在启动mysql镜像时通过免密方式.

通过这种方式实现了数据导入.

3.mysql容器启动问题.

由于是新建的Dockerfile,这一个问题也花费了大量时间,在容器启动时一直报mysql未启动的错误

因此setup脚本大概重写了十多个版本,最终将此问题解决(详见mysql/setup.sh文件)

4.设置mysql的root用户密码

由于需要实现数据导入,因此mysql权限设置为免密方式,但是这种方式不安全,因此想要解决掉此问题,重新设置root用户密码.

这一过程就不细讲了,尝试了各种方法,最终没有实现,由于浪费时间过多,因此放弃这一方案.(也许可以实现,但不想再去尝试了)

5.针对免密方式的补充

由于花费了太多时间在root用户的设置上,但是最终无法实现,因此选择了另外一种方案.

用户问题的方案是,新增tale数据库的管理用户并授权.(详见mysql/editpassword.sql文件)

安全问题是修改了docker-compose文件,不再将mysql容器端口暴露在宿主机中(平常测试时最好还是暴露端口,上线时删除即可).

6.mysql远程登录问题

其实改到第5步的时候,感觉功能已经差不多完成了,在联合启动时,又报了数据源无法连接的问题,原因就是容器中mysql未开启远程连接.

再次修改启动脚本.

7.blog容器无法连接连接mysql容器

本以为第6步中已经将连接问题解决,但是启动blog时还是报了同样的错误,通过本地客户端进行连接是正常的,证明了远程连接是没问题的.多次重复这一过程,发现还是无法连接.修改了各种参数,也进入到blog容器中查看host文件是否正常,都没有发现问题,也就是说配置都是正常的,但是每次报错都是同样的错,最后发现问题的原因出在初始化的时间差上,blog容器启动依赖mysql容器,mysql容器启动成功之后,才会执行blog容器启动,这一过程并没有问题,问题在mysql容器中还有一步初始化过程,可参考setup.sh脚本,这一过程需要时间,如果blog容器在这个过程中启动的话,由于权限问题还没有处理完成,因此无法连接mysql容器.因此修改了blog镜像的Dockerfile文件,并重写启动方法,将启动过程延迟执行,最终解决了这个问题(详见docker/startup.sh文件).

8.总结

问题解决了固然开心,但是也不能忘记了处理问题的过程带给自己的成长.当然,过程中也有一些非技术的失误,比如目录设置错误,镜像选择问题, 这些都是粗心导致的,过程中也花费了大量的时间,因为网上关于docker的资料实在有些少,只能自己去鼓捣,所以也是很心累,焦躁和烦闷导致了各种粗心,以后需注意.

上一篇:MVC+EF 入门教程(二)


下一篇:iOS瀑布流实现(Swift)