将数据的初始化放到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的资料实在有些少,只能自己去鼓捣,所以也是很心累,焦躁和烦闷导致了各种粗心,以后需注意.
第一次,当它本可进取时,却故作谦卑;
第二次,当它空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中虽不甘心,却又畏首畏尾。