寫在前面的話

《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)建那一刻即是如此,今后也是如此,只不過為了項(xiàng)目更友好而做了一些改動(dòng)使其不會(huì)強(qiáng)耦合于項(xiàng)目中。

問題描述

從項(xiàng)目開源至今,大大小小的問題已經(jīng)發(fā)現(xiàn)且解決了不少,但是直到近期才完全修復(fù)掉的一個(gè)大問題就是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ù)就都沒了,即使只是重啟也會(huì)抹去原先的數(shù)據(jù),這個(gè)就很尷尬了,我原以為最堅(jiān)硬的盔甲卻成了最柔弱的軟肋,這件事真的讓我低迷了很久。

一開始并沒有發(fā)現(xiàn)這個(gè)問題,而是在項(xiàng)目運(yùn)行一段時(shí)間之后,某一天由于服務(wù)器資源問題(服務(wù)器配置差)需要重啟,進(jìn)而導(dǎo)致myblog容器和mysql容器也得重啟,但是在重啟后發(fā)現(xiàn)原來添加的博客數(shù)據(jù)及留言數(shù)據(jù)消失了!
移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)
取而代之的是schema.sql中的幾條初始化數(shù)據(jù),當(dāng)時(shí)也認(rèn)真確認(rèn)是否存在錯(cuò)誤操作導(dǎo)致了數(shù)據(jù)被清空,結(jié)果就是一切流程都正常,過程中并沒有誤操,這個(gè)問題也只有在重啟時(shí)會(huì)出現(xiàn),這是流程設(shè)計(jì)的問題而且是一個(gè)十分致命的問題,如果不解決,將是這個(gè)項(xiàng)目最大的一個(gè)污點(diǎ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)語句是執(zhí)行setup.sh腳本文件,即mysql容器每次啟動(dòng)都會(huì)執(zhí)行setup.sh,包括第一次啟動(dòng)及此后的重啟,而每次執(zhí)行setup.sh都會(huì)重新初始化數(shù)據(jù),這里的數(shù)據(jù)