<code id="ebytu"><sup id="ebytu"><track id="ebytu"></track></sup></code>
    <td id="ebytu"><option id="ebytu"></option></td>
    <pre id="ebytu"><label id="ebytu"><menu id="ebytu"></menu></label></pre>
    <acronym id="ebytu"><label id="ebytu"><xmp id="ebytu"></xmp></label></acronym>
  1. <td id="ebytu"></td>

    <track id="ebytu"><ruby id="ebytu"></ruby></track>

            Docker容器啟動時初始化MySQL數據庫

            發表于:2020-5-27 14:31

            字體: | 上一篇 | 下一篇 | 我要投稿

             作者:碼農小胖哥    來源:開源中國

            #
            MySQL
            分享:
              1.前言
              Docker在開發中使用的越來越多了,最近搞了一個Spring Boot應用,為了方便部署將Mysql也放在Docker中運行。那么怎么初始化 SQL腳本以及數據呢?
              我這里有兩個傳統方案。 第一種方案是在容器啟動后手動導入,太low了不行。第二種在Spring Boot客戶端連接Mysql容器時初始化數據庫,你可以參考使用flyway進行數據庫版本控制一文,但是這依賴客戶端的能力。能不能做到Mysql容器啟動時就自己初始化數據庫呢?當然可以!今天就來演示一下。全部代碼見文末。
              2.原理
              當Mysql容器首次啟動時,會在 /docker-entrypoint-initdb.d目錄下掃描 .sh,.sql,.sql.gz類型的文件。如果這些類型的文件存在,將執行它們來初始化一個數據庫。這些文件會按照字母的順序執行。默認情況下它們會初始化在啟動容器時聲明的 MYSQL_DATABASE變量定義的數據庫中,例如下面的命令會初始化一個REGION_DB 數據庫:
             $ docker run --name some-mysql -e MYSQL_DATABASE=REGION_DB -d mysql:tag
              如果你的啟動命令沒有指定數據庫那么就必須在數據庫DDL腳本中聲明并指定使用該數據庫。否則就會實現下面的異常:
             ERROR 1046 (3D000) at line 7: No database selected
              那么接下來我們將利用這一機制來實現Docker容器啟動時初始化數據庫。
              3.自定義Dockerfile
              我們編寫自己的Dockerfile來實現我們的需求,這里以 Mysql:5.7 為例。不同的版本可能有一定的出入,需要詳細去閱讀官方文檔。腳本如下:
               FROM mysql:5.7
              LABEL OG=felord.cn
              COPY utf8mb4.cnf /etc/mysql/conf.d/utf8mb4.cnf
              COPY ./sql  /tmp/sql
              RUN mv /tmp/sql/*.sql /docker-entrypoint-initdb.d
              RUN rm -rf /tmp/sql
              第一步,引入官方 Mysql:5.7 Docker鏡像。
              第二步,無實際意義,主要是作者、組織信息。
              第三步,很重要!本來我沒有配置第三行,結果運行容器后發現初始化數據的中文全部亂碼了。所以需要在初始化數據庫前修改Mysql的編碼等配置,這里我順便把時區也改為了+8:00。
              第四步,復制包含數據庫腳本的 ./sql文件夾到鏡像的/tmp/sql下。
              第五步,使用 mv 命令把第四步拷貝的文件夾下的所有.sql文件復制到 /docker-entrypoint-initdb.d下,這樣才能利用2.章節的機制進行初始化數據庫。
              第六步,刪除使用過的臨時目錄。
              然后你可以通過構建鏡像命令構建自定義的Mysql鏡像:
               # 一定不要忘記最后的一個 . 點
              docker build -t mysql:5.7c .
              通過mysql:5.7c鏡像啟動一個名稱為mysql-service的容器,root密碼為123456,并持久化數據到宿主機 D:/mysql/data下:
            請在文本框輸入文字
              docker run --name mysql-service -v d:/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7c
              小貼士:你可以通過 SHOW VARIABLES LIKE 'character%' 查看字符集是否更改為utf8mb4,也可以通過SHOW VARIABLES LIKE '%time_zone%' 查看時區是否是東八區。
              4.總結
              今天我們自定義一個可以執行初始化數據庫的Mysql鏡像,方便我們進行部署。你也可以參考這個思路來定制其它一些自己需要的Docker鏡像。

                  本文內容不用于商業目的,如涉及知識產權問題,請權利人聯系博為峰小編(021-64471599-8017),我們將立即處理
            價值398元的測試課程免費贈送,填問卷領取吧!

            關注51Testing

            聯系我們

            快捷面板 站點地圖 聯系我們 廣告服務 關于我們 站長統計

            法律顧問:上海漕溪律師事務所 項棋律師
            版權所有 上海博為峰軟件技術股份有限公司 Copyright©51testing.com 2003-2022
            投訴及意見反饋:webmaster@51testing.com; 業務聯系:service@51testing.com 021-64471599-8017

            滬ICP備05003035號

            滬公網安備 31010102002173號

            亚洲春色校园小说_欧洲精品色在线观看视频_国产思思99RE99在线观看_天天躁日日躁狠狠躁日日躁

            <code id="ebytu"><sup id="ebytu"><track id="ebytu"></track></sup></code>
              <td id="ebytu"><option id="ebytu"></option></td>
              <pre id="ebytu"><label id="ebytu"><menu id="ebytu"></menu></label></pre>
              <acronym id="ebytu"><label id="ebytu"><xmp id="ebytu"></xmp></label></acronym>
            1. <td id="ebytu"></td>

              <track id="ebytu"><ruby id="ebytu"></ruby></track>