

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon ECS 容器映像的最佳實務
<a name="container-considerations"></a>

容器映像是一組關於如何建置容器的指示。容器映像會包含您應用程式的程式碼，以及應用程式的程式碼執行所需的所有相依性。應用程式相依性包括應用程式程式碼所依賴的原始程式碼套件、解譯語言的語言執行期，以及動態連結程式碼所依賴的二進位套件。

設計和建置容器映像時，請遵循下列準則：
+ 將所有應用程式相依性儲存為容器映像內的靜態檔案，使容器映像完整。

  如果變更容器映像中的某些內容，請建置包含變更的新容器映像。
+ 在容器內執行單一應用程式處理程序。

  容器生命週期是應用程式處理程序執行的長度。Amazon ECS 會取代異常終止的程序，並決定替代程序的啟動位置。完整的容器映像能有效提升整體部署的復原能力。
+ 讓應用程式處理 `SIGTERM`。

  當 Amazon ECS 停止任務時，會先向任務傳送 SIGTERM 訊號，告知應用程式需完成處理並關閉。然後，Amazon ECS 會傳送 `SIGKILL` 訊息。當應用程式忽略 `SIGTERM` 時，Amazon ECS 服務必須等待一段時間，再傳送 `SIGKILL` 訊號來終止程序。

  您需要確定應用程式完成自身工作所需的時間，並確保應用程式會處理 `SIGTERM` 訊號。在應用程式的訊號處理中，您需要停止應用程式接受新工作並完成正在進行的工作；如果工作需要太長時間才能完成，則需將未完成的工作儲存至任務外部的儲存空間。
+ 設定容器化應用程式以將日誌寫入 `stdout` 和 `stderr`。

  將日誌處理與應用程式程式碼分離，可讓您更靈活地調整基礎結構層級的日誌處理。其中一個範例是變更記錄系統。您可以調整設定，而不是修改服務以及建置與部署新的容器映像。
+ 使用標籤對容器映像進行版本控制。

  容器映像儲存在容器登錄中。登錄中的每個映像皆以標籤識別。有一個標籤名為 `latest`。此標籤的功能是指向最新版應用程式容器映像的指標，類似於 git 儲存庫中的 `HEAD`。建議您僅將 `latest` 標記用於測試目的。最佳實務是使用每個建置的唯一標籤來標記容器映像。我們建議您使用用於建置映像的 git commit 的 git SHA 來標記映像。

  您不需要為每次提交建置容器映像。不過，我們建議您在每次將特定程式碼提交發佈至生產環境時，都建置新的容器映像。我們還建議您使用與映像內部程式碼的 git commit 相對應的標籤來標記映像。如果您使用 git commit 標記映像，則可以更快找到映像正在執行的程式碼版本。

  我們也建議您在 Amazon Elastic Container Registry 中開啟不可變的映像標籤。使用此設定時，您無法變更標記指向的容器映像。相反地，Amazon ECR 強制要求必須將新映像上傳至新標籤。如需詳細資訊，請參閱《Amazon ECR 使用者指南》**中的[映像標籤可變性](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-tag-mutability.html)。

當您建構應用程式以在其中執行時 AWS Fargate，您必須決定將多個容器部署至相同的任務定義，以及在多個任務定義中分別部署容器。如需要下列條件，我們建議您在相同的任務定義中部署多個容器：
+ 容器共用相同的生命週期 (亦即，它們一起啟動和終止)。
+ 容器必須在相同的基礎主機上執行 (亦即，一個容器參考 localhost 連接埠上的另一個容器)。
+ 您的容器會共用資源。
+ 您的容器共用資料磁碟區。

如果不需要這些條件，我們建議在多個任務定義中分別部署容器。這能讓您分別對容器進行擴展、佈建與解除佈建。