讓我們澄清一些事情第一。當您在Dockerfile中同時使用ENTRYPOINT
和CMD
時,CMD
值將作爲參數傳遞給ENTRYPOINT
。所以你目前在文件中的轉換爲
/entrypoint.sh npm start
這是在啓動容器時執行的。在不知道entrypoint.sh
中發生了什麼的情況下,很難說出這有什麼影響。
泊塢
你可以做以下更改,請試試這個:
如果這樣做,請調整如下:
- 爲
wait-for-it.sh
的路徑 - 請調整無論你正在複製腳本文件在Dockerfile中。我建議你將它複製到與entrypoint.sh
相同的文件夾中。
localhost
參數爲wait-for-it.sh
腳本文件,請用您的數據庫主機替換。
上面做什麼,在運行wait-for-it.sh
腳本,然後,一旦數據庫已啓動,它運行您在ENTRYPOINT
和CMD
了前面的命令。它應該與您目前擁有的相媲美。
作爲替代方法,您也可以從entrypoint.sh
腳本中調用wait-for-it.sh
腳本,並且只運行其他步驟(npm start
,等待腳本成功後)。給你......
多克爾 - 撰寫
如果您使用的碼頭工人,撰寫了啓動你的容器,可以在容器開始使用command
屬性,在docker-compose.yaml
文件覆蓋所執行的命令,例如
command: >
bash -c "
/wait-for-it.sh localhost
&& /entrypoint.sh npm start
"
請注意,開始使用自己選擇的外殼(巴什在這種情況下)
引號多個命令使用
使用這種方法,您基本上可以鏈接多個命令以相互運行,並使用運算符&&
進行組合。
等待換它腳本
順便說一句:我用這個wait-for-it script用於與上述相同的方式良好的結果類似的目的。它比等待腳本的版本略強,並且幾乎支持任何主機/端口組合。我用它來等待MySQL - 你的問題不清楚它是關於MySQL還是PostgreSQL。
您可以刪除'ENTRYPOINT'並將它們放在'CMD'中:'CMD /entrypoint.sh && npm start'。 –
嗨,我做了你說的,但它似乎仍然無法執行成功的psql檢查後CMD命令。所以圖像是建立的,我的docker-compose執行wait-for-it腳本,它是成功的,所以我的容器可以啓動,但它出錯了。什麼都沒有發生 – DenCowboy
我認爲等待腳本需要參數。嘗試'/entrypoint.sh localhost npm start'。對不起,我現在無法測試,因爲我沒有Linux機器。 –