【问题标题】:How to bind host directory to ECS in terraform如何在terraform中将主机目录绑定到ECS
【发布时间】:2018-04-03 00:04:53
【问题描述】:

我一直在尝试在 ECS 上将应用程序容器化。我正在使用 terraform 来构建相同的基础架构。

现在,我想将主机目录挂载到容器中。在普通的 docker 上,我会使用 docker run -v <host_path>:<path_inside_container> 来执行此操作。但我无法在 terraform 中找到相同的等价物。

我已尝试在 aws_ecs_task_definition 中使用 volume 指令,但无法读取/写入主机目录。

resource "aws_ecs_task_definition" "my-application"{
    family = <application_family_name>
    task_role_arn = "${aws_iam_role.ecsTaskRole.arn}"
    network_mode  = "host"

    volume {
        name = <application_files>
        host_path = "/home/my_app_dir/"
    }

    container_definitions = <container_definitions>
}

提前致谢。

【问题讨论】:

    标签: amazon-web-services docker terraform amazon-ecs docker-container


    【解决方案1】:

    AWS ECS 允许您在任务定义中创建具有名称和源路径的数据卷

    "volumes": [
        {
          "name": "applicationData",
          "host": {
            "sourcePath": "/ecs/applicationData"
          }
        }
      ]
    

    以及容器定义中的挂载点。

    "mountPoints": [
            {
              "sourceVolume": "applicationData",
              "containerPath": "/usr/share/nginx/html"
            }
          ]
    

    上面显示的是cloudformation sn-ps,您可以尝试使用这些Terraform Apis 创建相同的。

    【讨论】:

    • 感谢@Amal 的回答。我没有意识到您答案中的 volume 块来自云形成(我没有使用过它。)。感谢@BMW 澄清这一点。
    • @Yash 感谢您的指出。我想分享 AWS 的概念。让我更新并提一下 cloudformation。
    • @Amal 您的解决方案有效,但对我来说有一个问题。我有一个配置文件被容器中的默认配置文件覆盖。例如当容器挂载它时,它会覆盖文件。我需要主机上的文件来覆盖容器。有什么想法吗?
    【解决方案2】:

    您需要做的是,在资源aws_ecs_task_definition中定义卷之后,在任务定义中添加一个映射。

    @Amal 已通过在任务定义中添加 mountPoints 来回答问题。 任务定义中的sourceVolume 必须与资源的volume 中的名称相同。

    这里需要说明的是,

    @amal 的卷代码部分是从 Cloudformation 模板复制的,但不能在 terraform 中使用。目前资源aws_ecs_task_definition 中没有支持地图的列表。您现有的卷代码很好。

    如果需要添加更多卷,使用这种方式

    resource "aws_ecs_task_definition" "my-application"{
        family = <application_family_name>
        task_role_arn = "${aws_iam_role.ecsTaskRole.arn}"
        network_mode  = "host"
    
        volume {
            name = <application_files>
            host_path = "/home/my_app_dir/"
        }
    
        volume {
            name = <application_files_2>
            host_path = "/home/my_app_dir-2/"
        }
    
        container_definitions = <container_definitions>
    }
    

    【讨论】:

    • 感谢 @BMW 清除 volumes 块来自 cloudformation。我正在搜索 terraform 文档。
    猜你喜欢
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多