2016-10-04 131 views
3

我正在使用wait-for-it腳本來檢查數據庫是否已啓動,然後再啓動我的其他應用程序。我發現這個腳本here。 現在我的應用程序容器停止運行,與MySQL is up - executing command。 所以腳本成功了(數據庫正在運行),但我不清楚如何執行我的應用程序的dockerfile中的真正CMD(腳本之後)。如何在succesfull等待腳本後啓動docker容器

這是我dockerfile結束:

COPY docker-entrypoint.sh /entrypoint.sh 
COPY ./wait-for-it.sh wait-for-it.sh 
ENTRYPOINT ["/entrypoint.sh"] 

EXPOSE 2368 
CMD ["npm", "start"] 
+0

您可以刪除'ENTRYPOINT'並將它們放在'CMD'中:'CMD /entrypoint.sh && npm start'。 –

+0

嗨,我做了你說的,但它似乎仍然無法執行成功的psql檢查後CMD命令。所以圖像是建立的,我的docker-compose執行wait-for-it腳本,它是成功的,所以我的容器可以啓動,但它出錯了。什麼都沒有發生 – DenCowboy

+0

我認爲等待腳本需要參數。嘗試'/entrypoint.sh localhost npm start'。對不起,我現在無法測試,因爲我沒有Linux機器。 –

回答

2

讓我們澄清一些事情第一。當您在Dockerfile中同時使用ENTRYPOINTCMD時,CMD值將作爲參數傳遞給ENTRYPOINT。所以你目前在文件中的轉換爲

/entrypoint.sh npm start 

這是在啓動容器時執行的。在不知道entrypoint.sh中發生了什麼的情況下,很難說出這有什麼影響。

泊塢

你可以做以下更改,請試試這個:

  • Dockerfile取出ENTRYPOINT
  • 更改CMD以下幾點:

    CMD /wait-for-it.sh localhost && /entrypoint.sh npm start 
    

如果這樣做,請調整如下:

  • wait-for-it.sh的路徑 - 請調整無論你正在複製腳本文件在Dockerfile中。我建議你將它複製到與entrypoint.sh相同的文件夾中。
  • localhost參數爲wait-for-it.sh腳本文件,請用您的數據庫主機替換。

上面做什麼,在運行wait-for-it.sh腳本,然後,一旦數據庫已啓動,它運行您在ENTRYPOINTCMD了前面的命令。它應該與您目前擁有的相媲美。

作爲替代方法,您也可以從entrypoint.sh腳本中調用wait-for-it.sh腳本,並且只運行其他步驟(npm start,等待腳本成功後)。給你......

多克爾 - 撰寫

如果您使用的碼頭工人,撰寫了啓動你的容器,可以在容器開始使用command屬性,在docker-compose.yaml文件覆蓋所執行的命令,例如

command: > 
    bash -c " 

    /wait-for-it.sh localhost 
    && /entrypoint.sh npm start 
    " 

請注意,開始使用自己選擇的外殼(巴什在這種情況下)

  • 引號多個命令使用

    • bash -c,你會需要它們具有多條線路。

    使用這種方法,您基本上可以鏈接多個命令以相互運行,並使用運算符&&進行組合。

    等待換它腳本

    順便說一句:我用這個wait-for-it script用於與上述相同的方式良好的結果類似的目的。它比等待腳本的版本略強,並且幾乎支持任何主機/端口組合。我用它來等待MySQL - 你的問題不清楚它是關於MySQL還是PostgreSQL。

  • +0

    感謝您的回覆。我使用的是mysql,但腳本是從docker文檔複製的,但適用於mysql並且運行良好。我也嘗試用docker-compose啓動它,所以我仍然需要編輯dockerfile? – DenCowboy

    +0

    我已經更新了有關Docker-Compose一節的答案 – nwinkler

    相關問題