对于使用平台版本
1.4.0
或更高版本(Linux)或者
1.0.0
或更高版本(Windows)在 AWS Fargate 上托管的任务,预设情况下,它们会收到至少 20GiB 的短暂存储以用于绑定挂载。对于 Linux 任务,临时存储总量最大可以增加到 200 GiB,方法是在任务定义中指定
ephemeralStorage
对象。您无法增加 Windows 容器的短暂存储。
要在任务运行时将 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 实例上托管的任务,如果未指定
host
和
sourcePath
值,则 Docker 进程守护程序将为您管理绑定挂载。如果没有容器引用此绑定挂载,则 Amazon ECS 容器代理任务清理服务最终会将其删除。默认情况下,这发生在容器退出三个小时后。但是,您可以使用
ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION
代理变量配置此持续时间。有关更多信息,请参阅
Amazon ECS 容器代理配置
。如果需要在容器的生命周期内保持此数据,请为绑定挂载指定一个
sourcePath
值。
在任务定义中指定绑定挂载
对于在
Fargate
或 Amazon EC2 实例
上托管的 Amazon ECS 任务,以下任务定义 JSON 代码段显示了任务定义的
volumes
、
mountPoints
和
ephemeralStorage
对象的语法。
"family": "",
"containerDefinitions" : [
"mountPoints" : [
"containerPath" : "
/path/to/mount_volume
",
"sourceVolume" : "
string
"
"name" : "
string
"
"volumes" : [
"name" : "
string
"
"ephemeralStorage":
{
"sizeInGiB":
integer
对于 Amazon EC2 实例上托管的 Amazon ECS 任务,您可以在指定任务卷详细信息时使用可选的
host
参数和
sourcePath
。指定后,它将绑定挂载与任务的生命周期而不是容器关联起来。
"volumes" : [
"host" : {
"sourcePath" : "string
"
"name" : "string
"
下面将更详细地描述每个任务定义参数。
类型:字符串
卷的名称。最多能包含 255 个字母 (大写和小写字母)、数字、连字符和下划线。此名称已在容器定义 sourceVolume
的 mountPoints
参数中引用。
使用绑定挂载时将指定此参数。要使用 Docker 卷,请改为指定 dockerVolumeConfiguration
。host
参数的内容确定您的绑定挂载数据卷是否一直保存在主机容器实例上以及存储它的位置上。如果 host
参数为空,则 Docker 进程守护程序将为您的数据卷分配一个主机路径,但不保证数据在与其关联的容器停止运行后将保留。
使用 EC2 或 Fargate 启动类型时支持绑定挂载主机卷。
Windows 容器可在 $env:ProgramData
所在的驱动器上挂载整个目录。
sourcePath
类型:字符串
在使用 host
参数时,指定 sourcePath
可声明提供给容器的主机容器实例上的路径。如果该参数为空,则 Docker 进程守护程序将为您分配一个主机路径。如果 host
参数包含 sourcePath
文件位置,则数据卷将在主机容器实例上的指定位置保留,除非您手动将其删除。如果主机容器实例上不存在 sourcePath
值,则 Docker 进程守护程序将创建该值。如果该位置不存在,则将导出源路径文件夹的内容。Windows 容器不支持此行为 有关在 Windows 容器上行为的信息,请参阅如果 moby Github 网站上缺少 #44799,Windows 上的 docker 绑定挂载不会在主机上创建新目录。
您的容器中数据卷的挂载点。
此参数将映射到 Docker Remote API 的创建容器部分中的 Volumes
以及 docker run 的 --volume
选项。
Windows 容器可在 $env:ProgramData
所在的驱动器上挂载整个目录。Windows 容器无法在其他驱动器上挂载目录,并且挂载点不能跨驱动器。
类型:对象
要为任务分配的临时存储容量。对于使用平台版本 1.4.0
或更高版本(Linux)或者 1.0.0
或更高版本(Windows)的 AWS Fargate 上托管的任务,此参数用于将短暂可用存储的总量扩展到默认数量之外。
您可以使用 Copilot CLI、CloudFormation、AWS SDK 或 CLI 为绑定挂载指定临时存储容量。
绑定挂载示例
以下示例介绍了为容器使用绑定挂载的最常见使用案例。
为 Fargate 任务分配更多的临时存储空间
对于在使用平台版本 1.4.0
或更高版本(Linux)或 1.0.0
(Windows)的 Fargate 上托管的 Amazon ECS 任务,您可以为任务中要使用的容器分配超过原定设置数量的短暂存储。此示例可以合并到其他示例中,以便为 Fargate 任务分配更多的临时存储空间。
-
在任务定义中,定义 ephemeralStorage
对象。sizeInGiB
必须是介于 21
和 200
之间的整数,单位是 GiB。
"ephemeralStorage": {
"sizeInGiB": integer
为一个或多个容器提供空数据卷
在某些用例中,您希望为任务中的容器提供一些临时空间。例如,您可能在任务期间具有需要访问同一临时文件存储位置的两个数据库容器。可以通过绑定挂载实现此目标。
-
在任务定义 volumes
部分中,使用名称 database_scratch
定义绑定挂载。
"volumes": [
"name": "database_scratch
",
在 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,用于写入要挂载到容器中的数据。此示例适用于 Fargate 或 Amazon EC2 实例上托管的任务。
-
创建 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"]
在任务定义 volumes
部分中,使用名称 application_logs
定义卷。
"volumes": [
"name": "application_logs
",
在 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
"
为与主机 Amazon EC2 实例生命周期相关的容器提供空数据卷
对于在 Amazon EC2 实例上托管的任务,可以使用绑定挂载,并将数据绑定到主机 Amazon EC2 实例的生命周期。您可以通过使用 host
参数并指定 sourcePath
值进行此操作。存在于 sourcePath
的任何文件将提交至值为 containerPath
的容器。写入 containerPath
值的任何文件将会写入主机 Amazon EC2 实例上的 sourcePath
值。
Amazon ECS 不会跨 Amazon EC2 实例同步您的存储。使用持久性存储的任务可置于您的集群中具有可用容量的任何 Amazon EC2 实例上。如果任务在停止和重新启动后需要持久存储,应始终在任务启动时使用 AWS CLI start-task 命令指定相同的 Amazon EC2 实例。您也可以将 Amazon EFS 卷用于持久性存储。有关更多信息,请参阅Amazon EFS 卷。
-
在任务定义 volumes
部分中,使用 name
和 sourcePath
值定义绑定挂载。在下面的示例中,主机 Amazon EC2 实例包含 /ecs/webdata
您希望挂载容器中的数据。
"volumes": [
"name": "webdata
",
"host": {
"sourcePath": "/ecs/webdata
"
在 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 服务器上以只读方式挂载该数据卷。
-
在任务定义 volumes
部分中,使用名称 webroot
和源路径 /data/webroot
定义数据卷。
"volumes": [
"name": "webroot
",
"host": {
"sourcePath": "/data/webroot
"
在 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
从其他容器挂载卷
对于托管在 Amazon EC2 实例上的任务,您可以在一个容器上定义一个或多个卷,然后在相同任务内的不同容器定义中使用 volumesFrom
参数从其初始定义的挂载点的 sourceContainer
中挂载所有卷。volumesFrom
参数适用于任务定义中定义的卷以及使用 Dockerfile 内置到映像中的卷。
-
(可选)要共享映像中内置的卷,请使用 Dockerfile 中的 VOLUME
指令。以下示例 Dockerfile 使用了 httpd
映像,然后添加卷并在 Apache 文档根目录中的 dockerfile_volume
处挂载卷。这是 httpd
Web 服务器使用的文件夹。
FROM httpd
VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]
您可以使用此 Dockerfile 生成映像并将其推送至存储库 (如 Docker Hub),然后在任务定义中使用它。以下步骤中使用的示例 my-repo/httpd_dockerfile_volume
映像是通过上述 Dockerfile 构建的。
创建一个为您的容器定义其他卷和挂载点的任务定义。在此示例 volumes
部分中,您将创建一个名为 empty
的空卷,此卷由 Docker 进程守护程序管理。还有一个定义的主机卷,被称为 host_etc
。它在主机容器实例上导出 /etc
文件夹。
"family": "test-volumes-from",
"volumes": [
"name": "empty",
"host": {}
"name": "host_etc",
"host": {
"sourcePath": "/etc"
在容器定义部分中,创建一个挂载之前定义的卷的容器。在此示例中,web
容器会挂载 empty
和 host_etc
卷。该容器使用通过 Dockerfile 中的卷构建的映像。
"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",
"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