

# 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 SHA 标记您的映像，以用于构建映像的 git commit。

  您无需为每次提交构建容器映像。但是，建议您在每次发布提交到生产环境的特定代码时都构建一个新的容器映像。还建议您使用与映像内部代码的 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 端口上引用另一个容器）。
+ 您的容器共享资源。
+ 您的容器共享数据卷。

当不需要满足这些条件时，我们建议您在多个任务定义中单独部署容器。这样一来，您可以分别扩展、预调配和取消预调配容器。