2015-02-24 65 views
6

我正在開發一個由Java Web應用程序和postgresql數據庫組成的開源應用程序。理想情況下是部署類似於shipyard quickstart的詳細過程:在Docker中管理數據庫模式的「正確」方法

  1. 運行純數據容器
  2. 運行DB容器
  3. 運行應用程序容器

是否有推薦該如何設置數據庫模式?我正在考慮爲數據庫映像創建Dockerfile時創建模式,但postgres在此時並未運行。

回答

3

我們使用的Postgres和碼頭工人,我的工作,我們最終做了以下內容:

  1. 複製Dockerfile從官方的Postgres回購這樣就可以使自己的形象。
  2. 修改docker-entrypoint.sh(https://github.com/docker-library/postgres/blob/8f80834e934b7deaccabb7bf81876190d72800f8/9.4/docker-entrypoint.sh),這是容器啓動時調用的內容。

在docker-entrypoint.sh的頂部,我把以下內容:

# Get the schema 
url=$(curl -s -u ${GIT_USER}:${GIT_PASSWORD} "${SQL_SCRIPT_URL}" | python -c 'import sys, json; print json.load(sys.stdin)["download_url"]') 
curl ${url} > db.sh 
chmod +x db.sh 
cp db.sh ./docker-entrypoint-initdb.d 

這基本上下載從GitHub一個shell腳本,初始化數據庫的架構。我們這樣做來管理模式的版本,所以當你啓動你的容器時,你可以通過一個ENV變量告訴它使用哪個模式。

關於代碼的一些注意事項:

  1. 我們需要重構到使用私鑰,而不是用戶憑據從GitHub拉東西。
  2. ./docker-entrypoint-initdb.d目錄是docker-entrypoint.sh將運行init腳本的地方。無論您想要如何將文件移動到該位置。如果從Github下載不適用,請執行此操作。
+0

謝謝。我認爲腳本是以這樣的方式編寫的,即在數據庫已經創建時運行它並不重要?我在想如果數據庫容器重新啓動。 – stewartml 2015-02-24 17:52:41

+0

是的,如果您將數據庫持久保存到具有共享卷的主機上,那麼當您重新啓動它時,可能會收到數據庫已存在的投訴。但對於諸如表格之類的東西,您可以使用IF NOT EXISTS,這樣它就不會抱怨太多。 =)我想你甚至可以更好地檢查數據庫以查看對象是否存在以及是否存在,然後停止。 – ryan1234 2015-02-24 17:55:13

相關問題