Compose 常見問題

docker composedocker-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 的歷史和發展.

uprunstart 之間的差異是什麼?

通常,您需要 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 中使用 CMDENTRYPOINT 的 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-inittini)。這些包裝器都能正確處理 SIGTERM 訊號。

如何在同一個主機上執行多個 Compose 檔案副本?

Compose 使用專案名稱為專案的所有容器和其他資源建立獨一無二的識別碼。要執行多個專案副本,請使用 -p 命令列選項或 COMPOSE_PROJECT_NAME 環境變數 設定自訂專案名稱。

我可以使用 JSON 而不是 YAML 作為我的 Compose 檔案嗎?

是的。 YAML 是 JSON 的超集

我應該使用 COPY/ADD 或掛載磁碟區來包含我的程式碼嗎?

您可以使用 Dockerfile 中的 COPYADD 指令將程式碼新增到映像檔中。如果您需要將程式碼與 Docker 映像檔一起重新定位,例如將程式碼傳送到另一個環境(生產環境、CI 等)時,這會很有用。

如果您想要變更程式碼並立即看到反映的結果,例如在開發程式碼且您的伺服器支援程式碼熱重載或即時重載時,請使用 volume(磁碟區)。

在某些情況下,您可能希望同時使用兩者。您可以使用 COPY 指令將程式碼包含在映像檔中,並在 Compose 檔案中使用 volume 指令在開發期間從主機包含程式碼。磁碟區會覆蓋映像檔的目錄內容。