将绑定挂载与 Amazon ECS 结合使用 - Amazon Elastic Container Service

将绑定挂载与 Amazon ECS 结合使用

使用绑定挂载,主机上的文件或目录(如 Amazon EC2 实例)被挂载到容器中。Fargate 和 Amazon EC2 实例上托管的任务都支持绑定挂载。绑定挂载与使用它们的容器的生命周期相关。停止使用绑定挂载的所有容器后(例如,停止任务时),数据将被删除。对于托管在 Amazon EC2 实例上的任务,可以通过在任务定义中指定 host 和可选值 sourcePath,将数据绑定到主机 Amazon EC2 实例的生命周期。有关更多信息,请参阅 Docker 文档中的 Bind mounts

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

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

  • 在一个或多个容器中挂载主机数据卷。

  • 与相同任务中的其他容器共享来自源容器的数据卷。

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

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

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

  • 默认情况下,使用平台版本 1.4.0 或更高版本(Linux)或者 1.0.0 或更高版本(Windows)在 AWS Fargate 上托管的任务会收到至少 20GiB 的临时存储以用于绑定挂载。您可以增加临时存储总量,最多可达 200GiB,方法是在您的任务定义中指定 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"]
  • 对于 Amazon EC2 实例上托管的任务,如果未指定 hostsourcePath 值,则 Docker 进程守护程序将为您管理绑定挂载。如果没有容器引用此绑定挂载,则 Amazon ECS 容器代理任务清理服务最终会将其删除。默认情况下,这发生在容器退出三个小时后。但是,您可以使用 ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION 代理变量配置此持续时间。有关更多信息,请参阅 Amazon ECS 容器代理配置。如果需要在容器的生命周期内保持此数据,请为绑定挂载指定一个 sourcePath 值。

  • 对于托管在 Amazon ECS 托管实例上的任务,其根文件系统部分为只读。读/写绑定挂载必须使用可写目录,例如 /var 用于存储永久数据或 /tmp 用于存储临时数据。尝试在其他目录创建读/写绑定挂载将导致任务启动失败,并返回类似如下错误:

    error creating empty volume: error while creating volume path '/path': mkdir /path: read-only file system

    只读绑定挂载(在 mountPoints 参数中配置 "readOnly": true)可以指向主机上任何可访问的目录。

    要查看完整的可写路径列表,您可以在 Amazon ECS 托管实例上运行一个任务,并使用相关命令检查实例的挂载表。创建一个任务定义,并进行如下设置以访问主机文件系统:

    { "pidMode": "host", "containerDefinitions": [{ "privileged": true, ... }] }

    然后在容器内执行以下命令:

    # List writable mounts cat /proc/1/root/proc/1/mounts | awk '$4 ~ /^rw,/ || $4 == "rw" {print $2}' | sort # List read-only mounts cat /proc/1/root/proc/1/mounts | awk '$4 ~ /^ro,/ || $4 == "ro" {print $2}' | sort
    重要

    privileged 设置在主机上授予容器扩展功能,相当于 root 权限。在本例中,此项设置用于检查主机的挂载表以进行诊断。有关更多信息,请参阅 避免以特权身份运行容器(Amazon EC2)

    有关在容器中运行交互式命令的更多信息,请参阅 使用 ECS Exec 监控 Amazon ECS 容器