我不確定我的問題是否相關,因爲我可能會嘗試混合不應混用的工具(Capistrano和Docker)。如何整合Capistrano與Docker進行部署?
我最近dockerized與Capistrano部署的應用程序。 Docker compose用於開發環境和登臺環境。
這是我的項目看起來像(未顯示的應用程序文件):
Capfile
docker-compose.yml
docker-compose.staging.yml
config/
deploy.rb
deploy
staging.rb
泊塢窗撰寫文件創建所有必需的容器(Nginx的,PHP,MongoDB的,Elasticsearch等)運行在開發或登臺環境中的應用程序(因此在docker-compose.staging.yml
中定義了一些特定參數)。
的應用程序部署到暫存環境中使用此命令:
cap staging deploy
服務器上的文件夾結構是斯特拉努的一個:
current
releases
20160912150720
20160912151003
20160912153905
shared
下面的命令已在已經運行current
登臺服務器的目錄實例化所有必要的容器來運行應用程序:
docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d
到目前爲止好。事情變得對未來部署更加複雜:在current
符號鏈接將指向releases
目錄的新目錄:
- 如果
deploy.rb
定義了需要的容器(如docker-compose exec php composer install
爲PHP)內要執行的命令,碼頭工人告訴容器還不存在(因爲現有的容器是在以前的發佈文件夾中創建的)。 - 如果在Capistrano部署過程中執行了
docker-compose up -d
命令,由於端口衝突(之前的容器仍然存在),我得到一些錯誤。
你對如何解決這個問題有想法嗎?我應該離開Capistrano並做一些不同的事情嗎?
這個想法是保持Capistrano爲Docker容器的靈活性(例如在同一臺服務器上爲各種應用程序提供幾個PHP版本)所提供的零宕機時間部署。
謝謝你的回答! 我可能應該將Capistrano從主機部署到服務器。 我已經有了應用程序作爲容器,所以這應該是沒問題的爲它建立一個圖像。由於它不會使用卷共享(對開發環境有用),我是否需要特定的Dockerfile來添加COPY/RUN語句?我想我必須確保應用程序中的上傳目錄仍然是裝入的卷,以便在部署新的應用程序映像時不會重置它們。 對於整個部署過程的設置是否有很好的教程? (簡單的)。 –
正如上面提到的那樣,在編譯期間添加COPY以將代碼部署到您的映像中。 –