绑定挂载 - Amazon ECS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

绑定挂载

使用绑定挂载,主机上的文件或目录(如 Amazon Fargate)被挂载到容器中。绑定挂载与使用它们的容器的生命周期相关。停止使用绑定挂载的所有容器后(例如,停止任务时),数据将被删除。有关更多信息,请参阅 Docker 文档中的使用绑定挂载

以下是绑定挂载的常见使用案例。

  • 提供空数据卷以挂载在一个或多个容器中。

  • 将 Dockerfile 路径及其内容公开到一个或多个容器。

使用绑定挂载时的注意事项

使用绑定挂载时应考虑以下事项。

  • 对于使用平台版本 1.4.0 或更高版本(Linux)或者 1.0.0 或更高版本(Windows)在 Amazon Fargate 上托管的任务,预设情况下,它们会收到至少 20GiB 的短暂存储以用于绑定挂载。临时存储总量最大可以增加到 200 GiB,方法是指定 ephemeralStorage 对象中的任务定义。

  • 要在任务运行时将 Dockerfile 中的文件公开到数据卷,Amazon ECS 数据平面将查找 VOLUME 指令。如果 VOLUME 指令中指定的绝对路径与任务定义中指定的 containerPath 绝对路径相同,则指令路径 VOLUME 中的数据将复制到数据卷。在下面的 Dockerfile 示例中,/var/log/exported 目录中名为 examplefile 的文件将写入主机,然后挂载到容器中。

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN mkdir -p /var/log/exported RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"]

    预设情况下,卷权限设置为 0755 和所有者设置为 root。您可以在 Dockerfile 中自定义这些权限。以下示例将目录的所有者定义为 node

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN yum install -y shadow-utils && yum clean all RUN useradd node RUN mkdir -p /var/log/exported && chown node:node /var/log/exported RUN touch /var/log/exported/examplefile USER node VOLUME ["/var/log/exported"]

在任务定义中指定绑定挂载

对于在 Fargate上托管的 Amazon ECS 任务,以下任务定义 JSON 代码段显示了任务定义的 volumesmountPointsephemeralStorage 对象的语法。

{ "family": "", ... "containerDefinitions" : [ { "mountPoints" : [ { "containerPath" : "/path/to/mount_volume", "sourceVolume" : "string" } ], "name" : "string" } ], ... "volumes" : [ { "name" : "string" } ], "ephemeralStorage": { "sizeInGiB": integer } }

下面将更详细地描述每个任务定义参数。

name

类型:字符串

必需:否

卷的名称。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。此名称已在容器定义 sourceVolumemountPoints 参数中引用。

mountPoints

类型:对象数组

必需:否

您的容器中数据卷的挂载点。

此参数将映射到 Docker Remote API创建容器部分中的 Volumes 以及 docker run--volume 选项。

Windows 容器可在 $env:ProgramData 所在的驱动器上挂载整个目录。Windows 容器无法在其他驱动器上挂载目录,并且挂载点不能跨驱动器。

sourceVolume

类型:字符串

必需:是,当使用 mountPoints

要挂载的卷的名称。

containerPath

类型:字符串

必需:是,当使用 mountPoints

要将卷挂载到的容器上的路径。

readOnly

类型:布尔值

必需:否

如果此值为 true,则容器具有对卷的只读访问权。如果此值为 false,则容器可对卷进行写入。默认值为 false

ephemeralStorage

类型:对象

必需:否

要为任务分配的临时存储容量。对于使用平台版本 1.4.0 或更高版本(Linux)或者 1.0.0 或更高版本(Windows)的 Amazon Fargate 上托管的任务,此参数用于将短暂可用存储的总量扩展到默认数量之外。

您可以使用 Copilot CLI、CloudFormation、Amazon SDK 或 CLI 为绑定挂载指定临时存储容量。

绑定挂载示例

以下示例介绍了为容器使用绑定挂载的最常见使用案例。

为 Fargate 任务分配更多的临时存储空间

对于在使用平台版本 1.4.0 或更高版本(Linux)或 1.0.0(Windows)的 Fargate 上托管的 Amazon ECS 任务,您可以为任务中要使用的容器分配超过原定设置数量的短暂存储。此示例可以合并到其他示例中,以便为 Fargate 任务分配更多的临时存储空间。

  • 在任务定义中,定义 ephemeralStorage 对象。sizeInGiB 必须是介于 21200 之间的整数,单位是 GiB。

    "ephemeralStorage": { "sizeInGiB": integer }

为一个或多个容器提供空数据卷

在某些用例中,您希望为任务中的容器提供一些临时空间。例如,您可能在任务期间具有需要访问同一临时文件存储位置的两个数据库容器。可以通过绑定挂载实现此目标。

  1. 在任务定义 volumes 部分中,使用名称 database_scratch 定义绑定挂载。

    "volumes": [ { "name": "database_scratch", } ]
  2. containerDefinitions 部分中,创建数据库容器定义。以便它们挂载卷。

    "containerDefinitions": [ { "name": "database1", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] }, { "name": "database2", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] } ]

将 Dockerfile 中的路径及其内容公开给容器

在本例中,您有一个 Dockerfile,用于写入要挂载到容器中的数据。

  1. 创建 Dockerfile。下面的示例使用公共 Amazon Linux2 容器映像,并在我们希望挂载容器的 /var/log/exported 目录中创建一个名为 examplefile 的文件。VOLUME 指令应该指定绝对路径。

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN mkdir -p /var/log/exported RUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"]

    预设情况下,卷权限设置为 0755 和所有者设置为 root。可以在 Dockerfile 中变更这些权限。在下面的示例中,/var/log/exported 目录的所有者设置为 node

    FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN yum install -y shadow-utils && yum clean all RUN useradd node RUN mkdir -p /var/log/exported && chown node:node /var/log/exported RUN touch /var/log/exported/examplefile USER node VOLUME ["/var/log/exported"]
  2. 在任务定义 volumes 部分中,使用名称 application_logs 定义卷。

    "volumes": [ { "name": "application_logs", } ]
  3. containerDefinitions 部分中,创建应用程序容器定义。以便它们挂载存储。containerPath 值必须与 Dockerfile 的 VOLUME 指令中指定的绝对路径匹配。

    "containerDefinitions": [ { "name": "application1", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] }, { "name": "application2", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] } ]