Compose 常見問題
docker compose
和 docker-compose
之間的差異是什麼
Docker Compose 命令列二進位檔的第一版於 2014 年首次發佈。它是用 Python 編寫的,並使用 docker-compose
呼叫。通常,Compose V1 專案在 compose.yml 檔案中包含一個頂層版本元素,其值範圍從 2.0 到 3.8,指的是特定的檔案格式。
Docker Compose 命令列二進位檔的第二版於 2020 年發佈,它是用 Go 編寫的,並使用 docker compose
呼叫。Compose V2 會忽略 compose.yml 檔案中的頂層版本元素。
如需更多資訊,請參閱 Compose 的歷史和發展.
up
、run
和 start
之間的差異是什麼?
通常,您需要 docker compose up
。使用 up
來啟動或重新啟動 compose.yml
中定義的所有服務。在預設的「附加」模式中,您會看到所有容器的所有記錄。在「分離」模式 (-d
) 中,Compose 在啟動容器後會結束,但容器會繼續在背景執行。
docker compose run
命令是用於執行「一次性」或「臨時」任務。它需要您要執行的服務名稱,並且只會啟動執行中服務所依賴的服務的容器。使用 run
來執行測試或執行管理任務,例如移除或新增資料到資料磁碟區容器。run
命令的作用類似於 docker run -ti
,它會開啟容器的互動式終端機,並傳回與容器中處理程序的結束狀態相符的結束狀態。
docker compose start
命令僅適用於重新啟動先前已建立但已停止的容器。它永遠不會建立新的容器。
為什麼我的服務需要 10 秒鐘才能重新建立或停止?
docker compose stop
命令會嘗試透過傳送 SIGTERM
來停止容器。然後它會等待 預設的 10 秒逾時。逾時後,會將 SIGKILL
傳送到容器以強制終止它。如果您正在等待此逾時,則表示您的容器在收到 SIGTERM
訊號時沒有關閉。
關於 處理程序處理訊號 的問題已經有很多文章了。
要解決此問題,請嘗試以下操作
請確認您在 Dockerfile 中使用
CMD
和ENTRYPOINT
的 exec 形式例如,使用
["program", "arg1", "arg2"]
而不是"program arg1 arg2"
。使用字串形式會導致 Docker 使用bash
執行您的處理程序,而bash
無法正確處理訊號。Compose 永遠使用 JSON 形式,因此如果您覆蓋 Compose 檔案中的命令或進入點,則無需擔心。如果可以,請修改您正在執行的應用程式,以新增
SIGTERM
的明確訊號處理常式。將
stop_signal
設定為應用程式知道如何處理的訊號。services: web: build: . stop_signal: SIGINT
如果您無法修改應用程式,請將應用程式包裝在輕量級的 init 系統中(例如 s6) 或訊號代理(例如 dumb-init)。這些包裝器都能正確處理
SIGTERM
訊號。
如何在同一個主機上執行多個 Compose 檔案副本?
Compose 使用專案名稱為專案的所有容器和其他資源建立獨一無二的識別碼。要執行多個專案副本,請使用 -p
命令列選項或 COMPOSE_PROJECT_NAME
環境變數 設定自訂專案名稱。
我可以使用 JSON 而不是 YAML 作為我的 Compose 檔案嗎?
是的。 YAML 是 JSON 的超集$ docker compose -f docker-compose.json up