寫在前面的話
《Docker+SpringBoot+Mybatis+thymeleaf的Java博客系統(tǒng)開源啦》
《Java開源博客My-Blog之docker容器組件化修改》
My Blog項(xiàng)目已經(jīng)開源了兩個(gè)多月,也收獲了不少star,在這里謝謝各位朋友的建議及幫助。由于個(gè)人原因,這個(gè)開源項(xiàng)目最初的定位其實(shí)是一個(gè)docker技術(shù)與springboot框架整合的Java博客系統(tǒng)實(shí)戰(zhàn)項(xiàng)目,而且是一個(gè)容器技術(shù)的練手項(xiàng)目,技術(shù)的偏重也更多的在容器技術(shù)及容器編排上。
雖然上個(gè)版本做了一些改動(dòng),將docker踢出主目錄,原因也是為了照顧其他關(guān)注和想要使用My Blog的朋友能夠很快的上手項(xiàng)目,但是docker容器技術(shù)依然是這個(gè)項(xiàng)目不可缺少的一部分,從項(xiàng)目創(chuàng)建那一刻即是如此,今后也是如此,只不過(guò)為了項(xiàng)目更友好而做了一些改動(dòng)使其不會(huì)強(qiáng)耦合于項(xiàng)目中。
問(wèn)題描述
從項(xiàng)目開源至今,大大小小的問(wèn)題已經(jīng)發(fā)現(xiàn)且解決了不少,但是直到近期才完全修復(fù)掉的一個(gè)大問(wèn)題就是mysql容器重復(fù)初始化導(dǎo)致原數(shù)據(jù)被抹去的bug。
熟悉這個(gè)項(xiàng)目的朋友應(yīng)該知道,項(xiàng)目初期為了讓mysql容器可以自動(dòng)初始化數(shù)據(jù)花了多少精力,但是這個(gè)一直讓我覺得很完美的改動(dòng)卻有一個(gè)非常致命的缺陷,一旦數(shù)據(jù)容器mysql掛掉了或者需要重啟,原先的數(shù)據(jù)就都沒(méi)了,即使只是重啟也會(huì)抹去原先的數(shù)據(jù),這個(gè)就很尷尬了,我原以為最堅(jiān)硬的盔甲卻成了最柔弱的軟肋,這件事真的讓我低迷了很久。
一開始并沒(méi)有發(fā)現(xiàn)這個(gè)問(wèn)題,而是在項(xiàng)目運(yùn)行一段時(shí)間之后,某一天由于服務(wù)器資源問(wèn)題(服務(wù)器配置差)需要重啟,進(jìn)而導(dǎo)致myblog容器和mysql容器也得重啟,但是在重啟后發(fā)現(xiàn)原來(lái)添加的博客數(shù)據(jù)及留言數(shù)據(jù)消失了!
取而代之的是schema.sql中的幾條初始化數(shù)據(jù),當(dāng)時(shí)也認(rèn)真確認(rèn)是否存在錯(cuò)誤操作導(dǎo)致了數(shù)據(jù)被清空,結(jié)果就是一切流程都正常,過(guò)程中并沒(méi)有誤操,這個(gè)問(wèn)題也只有在重啟時(shí)會(huì)出現(xiàn),這是流程設(shè)計(jì)的問(wèn)題而且是一個(gè)十分致命的問(wèn)題,如果不解決,將是這個(gè)項(xiàng)目最大的一個(gè)污點(diǎn)。
問(wèn)題原因
FROM mysql:5.7ENV MYSQL_DATABASE test ENV MYSQL_ALLOW_EMPTY_PASSWORD yes COPY setup.sh /mysql/setup.sh COPY schema.sql /mysql/schema.sql COPY privileges.sql /mysql/privileges.sql#設(shè)置容器啟動(dòng)時(shí)執(zhí)行的命令CMD ["bash", "/mysql/setup.sh"]
以上為mysql容器的Dockerfile文件,文件中定義了容器的啟動(dòng)語(yǔ)句是執(zhí)行setup.sh腳本文件,即mysql容器每次啟動(dòng)都會(huì)執(zhí)行setup.sh,包括第一次啟動(dòng)及此后的重啟,而每次執(zhí)行setup.sh都會(huì)重新初始化數(shù)據(jù),這里的數(shù)據(jù)