2017-08-16 22 views
0

我正在運行一個包含節點服務器的docker容器。我想附加到容器,殺死正在運行的服務器,然後重新啓動它(用於開發)。但是,當我殺死節點服務器時,它會殺死整個容器(可能是因爲我正在殺死容器啓動的過程)。如何在不殺死整個容器的情況下終止docker容器默認命令?

這可能嗎? This answer有幫助,但它沒有解釋如何殺死容器的默認進程而不殺死容器(如果可能的話)。

如果我想要做的事是不可能的,那麼解決這個問題的最好方法是什麼?將command: bash -c "while true; do echo 'Hit CTRL+C'; sleep 1; done"添加到我的docker-compose中的每個圖像中,正如鏈接答案的註釋中所建議的,似乎並不是理想的解決方案,因爲它迫使我在啓動並附加到容器後手動運行命令。

+0

一旦停止nodejs,是否有失敗的健康檢查? – herm

回答

3

這是由Docker設計的。每個容器應該是一個服務的無狀態實例。如果該服務中斷,容器將被銷燬。如果該服務被請求/啓動,則它被創建。如果你至少使用k8s,swarm,mesos,cattle等編排平臺。

存在代表PID 1而不是服務本身的應用程序。但這違背了微服務和容器的設計理念。下面是一個可以作爲PID 1運行的init系統的示例,它允許您隨意在您的容器中終止並生成進程:https://github.com/Yelp/dumb-init

爲什麼要重新啓動節點服務器?要應用配置文件或其他內容的更改?如果是這樣,你正在尋找一個方向錯誤的解決方案。您應該定義一個持久性卷,以便在容器重新生成時服務將重新讀取所述配置文件。

https://docs.docker.com/engine/admin/volumes/volumes/

2

如果需要重新啓動的運行容器中的過程,然後只需運行:

docker restart $container_name_or_id 

Exec'ing放入容器不應該需要進行正常操作,考慮到一個調試工具。

而不是改變這種獲取運行自動重新啓動腳本,我謹出來泊塢窗引擎,所以,如果你的容器崩潰的可見:

docker run --restart=unless-stopped ... 

當容器運行上述選項,除非您有意在容器上運行docker stop,否則碼頭工人將爲您重啓。

至於爲什麼殺死容器中的pid 1將其關閉,這與在Linux服務器上殺死pid 1相同。如果你殺了init/systemd,這個盒子就會掉下來。在容器的名稱空間內,類似的規則適用並且不能更改。

相關問題