Laradock與MySQL Container的操作

Laradock如何利用sql檔建立或更新MySQL資料庫

James Shieh
技術保鮮盒
9 min readMar 30, 2019

--

Photo by Alexandru Acea on Unsplash

0.Edit SQL File
編輯SQL File

laradock預設會在MySQL容器建立完成時執行laradock/mysql/docker-entrypoint-initdb.d/l目錄下的createdb.sql,通常我們只要在這裏插入需要的SQL就可以了。

不過預設的方法必須在createdb.sql中留下資料庫名稱、使用者名稱,甚至需要建立使用者與密碼,而這些資料已經紀錄在.env的環境參數裡了。

我們其實可以寫一個shell script,直接抓環境參數去做建立資料庫與使用者、操作授權等行為,讓createdb.sql單純做sql import的動作,這樣日後在維護上可以有幾個效益:

  1. 資料庫連線資訊統一由.env管理,不會分散四處,造成修改的麻煩。
  2. 日後資料庫更新時,直接將dump出來的sql檔作為createdb.sql即可,不需要額外撰寫sql檔,開發人員在部署時更加便捷。

所以我在docker-entrypoint-initdb.d下,建立一個database-loader.sh:

接著修改Dockerfile,讓mysql container建立時,去執行database-loader.sh

1.Remove Old Databse
移除舊的資料庫

匯入新的SQL,必須先將原本的資料庫檔清空,查詢.env檔中的DATA_PATH_HOST所設定的目錄:

到指定的目錄底下將mysql資料夾刪除(若第一次建立可跳過此步驟):

2.Recreate MySQL Container
重新建立與啟動MySQL容器

執行以下指令:

3.Check MySQL Container
檢查MySQL 是否正確啟動

執行以下指令,確定MySQL Service顯示ready for connections:

如果沒有正常啟動,可以從log中看到出錯的原因,最容易發生的問題通常是sql語法問題:

有時候,我們得進入到容器裡去查看更詳細的資訊,可使用以下指令:

4.Modify Configuration Files
修改設定檔

如果資料庫中的資料編碼有問題,可能需要設定my.cnf檔

或者在createdb.sql中加入字元集設定:

結語

本篇分享:

  1. 如何在Laradock下執行需要的SQL file
  2. 如何將資料庫連線資訊從SQL file中抽離,並由.env統一管理
  3. 疑難排解與相關參數設定

--

--

James Shieh
技術保鮮盒

Find something more important than you are and dedicate your life to it.