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

绑定挂载

使用绑定装载,主机上的文件或目录将装载到容器中。使用 EC2 启动类型的任务支持绑定挂载主机卷。

要将绑定挂载主机卷与使用 EC2 启动类型的任务结合使用,请在任务定义中指定 host 和可选的 sourcePath 值。有关详细信息,请参阅使用绑定挂载

注意

有关 Fargate 任务上 Amazon ECS 的任务存储的信息,请参阅 Fargate 任务存储

绑定挂载的一些常见使用案例包括:

  • 提供持久性数据卷以用于容器

  • 定义空的非持久性数据卷,并将其挂载到同一容器实例上的多个容器

  • 在同一个容器实例上不同容器中的不同位置共享定义的数据卷

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

在您的容器可以使用绑定挂载主机卷之前,您必须在任务定义中指定卷和挂载点配置。此部分描述容器的卷配置。对于使用绑定挂载主机卷的任务,请指定 host 值和可选的 sourcePath 值。

以下任务定义 JSON 代码段显示容器的 volumesmountPoints 对象的语法:

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

类型:字符串

必需:否

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

host

必需:否

使用绑定装载时将指定此参数。要使用 Docker 卷,请改为指定 dockerVolumeConfigurationhost 参数的内容确定您的绑定装载数据卷是否一直保存在主机容器实例上以及存储它的位置上。如果 host 参数为空,则 Docker 守护程序将为您的数据卷分配一个主机路径,但不保证数据在与其关联的容器停止运行后将保留。

当使用 EC2 或 Fargate 启动类型时,支持绑定装载主机卷。

Windows 容器可在 $env:ProgramData 所在的驱动器上装载整个目录。

sourcePath

类型:字符串

必需:否

在使用 host 参数时,指定 sourcePath 可声明提供给容器的主机容器实例上的路径。如果该参数为空,则 Docker 守护程序将为您分配一个主机路径。如果 host 参数包含 sourcePath 文件位置,则数据卷将在主机容器实例上的指定位置保留,除非您手动将其删除。如果主机容器实例上不存在 sourcePath 值,则 Docker 守护程序将创建该值。如果该位置不存在,则将导出源路径文件夹的内容。

mountPoints

类型:对象数组

必需:否

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

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

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

sourceVolume

类型:字符串

必需:是,当使用 mountPoints

要挂载的卷的名称。

containerPath

类型:字符串

必需:是,当使用 mountPoints

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

readOnly

类型:布尔值

必需:否

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

示例

使用绑定挂载为容器提供非持久性的空存储

在某些情况下,您希望容器共享同一空数据卷,但您不希望在完成任务后保留该数据。例如,您可能在任务期间具有需要访问同一临时文件存储位置的两个数据库容器。此任务可以使用 Docker 卷或绑定挂载主机卷来实现。

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

    注意

    由于 database_scratch 绑定挂载未指定源路径,因此 Docker 守护程序会为您管理此绑定挂载。如果任何容器均未引用此绑定挂载,则 Amazon ECS 容器代理任务清除服务最终会将其删除(默认情况下,此情况会在容器存在 3 小时后出现,但您可以使用 ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION 代理变量配置此持续时间)。有关更多信息,请参阅 Amazon ECS 容器代理配置。如果您需要保留此数据,请为绑定挂载指定 sourcePath 值。

    "volumes": [ { "name": "database_scratch", "host": {} } ]
  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" } ] } ]

使用绑定挂载为容器提供持久性存储

当使用绑定挂载时,如果指定 sourcePath 值,则数据即使在引用它的所有容器停止后也将保留。存在于 sourcePath 的任何文件将提供给位于 containerPath 值的容器,而且写入 containerPath 值的任何文件将写入容器实例上的 sourcePath 值。

重要

Amazon ECS 不会跨容器实例同步存储。使用持久性存储的任务可置于您的集群中具有可用容量的任何容器实例上。如果任务在停止和重新启动后需要持久性存储,则您应始终在使用 AWS CLI start-task 命令启动任务时指定相同的容器实例。

  1. 在任务定义 volumes 部分中,使用 namesourcePath 值定义绑定挂载。

    "volumes": [ { "name": "webdata", "host": { "sourcePath": "/ecs/webdata" } } ]
  2. containerDefinitions 部分中,使用引用已定义绑定挂载的名称的 mountPoints 值和要在容器上挂载绑定挂载的 containerPath 值定义容器。

    "containerDefinitions": [ { "name": "web", "image": "nginx", "cpu": 99, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webdata", "containerPath": "/usr/share/nginx/html" } ] } ]

在多个容器上挂载定义的卷

您可以在任务定义中定义数据卷并在其他容器上的不同位置挂载该卷。例如,您的主机容器具有位于 /data/webroot 的网站数据文件夹,并且您可能想在具有不同文档根目录的两个不同 Web 服务器上以只读方式挂载该数据卷。

  1. 在任务定义 volumes 部分中,使用名称 webroot 和源路径 /data/webroot 定义数据卷。

    "volumes": [ { "name": "webroot", "host": { "sourcePath": "/data/webroot" } } ]
  2. containerDefinitions 部分中,使用将 mountPoints 卷与指向容器的文档根目录的 webroot 值关联的 containerPath 值为每个 Web 服务器定义容器。

    "containerDefinitions": [ { "name": "web-server-1", "image": "my-repo/ubuntu-apache", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot", "containerPath": "/var/www/html", "readOnly": true } ] }, { "name": "web-server-2", "image": "my-repo/sles11-apache", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 8080, "hostPort": 8080 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot", "containerPath": "/srv/www/htdocs", "readOnly": true } ] } ]

使用 volumesFrom 从其他容器挂载卷

您可以在一个容器上定义一个或多个卷,然后在不同的容器定义中使用 volumesFrom 参数(相同任务内)从其初始定义的挂载点的 sourceContainer 中挂载所有卷。volumesFrom 参数适用于任务定义中定义的卷以及使用 Dockerfile 内置到映像中的卷。

  1. (可选)要共享内置到映像中的卷,您需要使用在 VOLUME 指令中声明的卷构建映像。以下示例 Dockerfile 使用了 httpd 映像,然后添加卷并在 Apache 文档根目录 (由 httpd Web 服务器使用的文件夹) 中的 dockerfile_volume 处挂载卷:

    FROM httpd VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]

    您可以使用此 Dockerfile 生成映像并将其推送至存储库 (如 Docker Hub),然后在任务定义中使用它。以下步骤中使用的示例 my-repo/httpd_dockerfile_volume 映像是通过上述 Dockerfile 构建的。

  2. 创建一个为您的容器定义其他卷和挂载点的任务定义。在此示例 volumes 部分中,您将创建一个名为 empty 的空卷,此卷由 Docker 守护程序管理。此外,还将定义一个称为 host_etc 的主机卷,该卷导出主机容器实例上的 /etc 文件夹。

    { "family": "test-volumes-from", "volumes": [ { "name": "empty", "host": {} }, { "name": "host_etc", "host": { "sourcePath": "/etc" } } ],

    在容器定义部分中,创建一个挂载之前定义的卷的容器。在此示例中,web 容器(此容器使用通过 Dockerfile 中的卷构建的映像)挂载 emptyhost_etc 卷。

    "containerDefinitions": [ { "name": "web", "image": "my-repo/httpd_dockerfile_volume", "cpu": 100, "memory": 500, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "mountPoints": [ { "sourceVolume": "empty", "containerPath": "/usr/local/apache2/htdocs/empty_volume" }, { "sourceVolume": "host_etc", "containerPath": "/usr/local/apache2/htdocs/host_etc" } ], "essential": true },

    创建另一个容器,该容器使用 volumesFrom 挂载与 web 容器关联的所有卷。web 容器上的所有卷也同样会挂载到 busybox 容器上(包括 Dockerfile 中指定的用于构建 my-repo/httpd_dockerfile_volume 映像的卷)。

    { "name": "busybox", "image": "busybox", "volumesFrom": [ { "sourceContainer": "web" } ], "cpu": 100, "memory": 500, "entryPoint": [ "sh", "-c" ], "command": [ "echo $(date) > /usr/local/apache2/htdocs/empty_volume/date && echo $(date) > /usr/local/apache2/htdocs/host_etc/date && echo $(date) > /usr/local/apache2/htdocs/dockerfile_volume/date" ], "essential": false } ] }

    当此任务运行时,这两个容器将挂载卷,并且 busybox 容器中的 command 会将日期和时间写入每个卷文件夹中称为 date 的文件。这些文件夹随后将显示在由 web 容器显示的网站上。

    注意

    由于 busybox 容器运行快速命令然后退出,它必须在容器定义中设置为 "essential": false。否则,它在退出时会停止整个任务。