

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置 Dockerrun.aws.json v2 文件
<a name="create_deploy_docker_v2config"></a>

`Dockerrun.aws.json v2` 是 Elastic Beanstalk 配置文件，描述如何将一组托管在 ECS 集群中的 Docker 容器部署到 Elastic Beanstalk 环境中。Elastic Beanstalk 平台创建 ECS *任务定义*，其中包括 ECS *容器定义*。这些定义在 `Dockerrun.aws.json` 配置文件中描述。

`Dockerrun.aws.json` 文件中的容器定义描述了要部署到 ECS 集群中每个 Amazon EC2 实例的容器。在这种情况下，Amazon EC2 实例也被称为主机*容器实例*，因为其托管 Docker 容器。配置文件还描述了要在主机容器实例上创建的用于挂载 Docker 容器的数据卷。有关 Elastic Beanstalk 上的 ECS 托管 Docker 环境中的组件的更多信息和示意图，请参阅本章前面的 [ECS 托管 Docker 平台概述](create_deploy_docker_ecs.md#create_deploy_docker_ecs_platform)。

 `Dockerrun.aws.json` 文件既可单独使用，也可与其他源代码一起压缩到一个存档中。与 `Dockerrun.aws.json` 一起存档的源代码将部署到 Amazon EC2 容器实例中，并且可在 `/var/app/current/` 目录中进行访问。

**Topics**
+ [`Dockerrun.aws.json` v2](#create_deploy_docker_v2config_dockerrun)
+ [卷格式](#create_deploy_docker_v2config_volume_format)
+ [执行角色 ARN 格式](#create_deploy_docker_v2config_executionRoleArn_format)
+ [容器定义格式](#create_deploy_docker_v2config_dockerrun_format)
+ [验证库格式 – 使用私有存储库中的映像](#docker-multicontainer-dockerrun-privaterepo)
+ [示例 Dockerrun.aws.json v2](#create_deploy_docker_v2config_example)

## `Dockerrun.aws.json` v2
<a name="create_deploy_docker_v2config_dockerrun"></a>

`Dockerrun.aws.json` 文件包含以下部分：

**AWSEBDockerrun版本**  
对于 ECS 托管式 Docker 环境，请将版本号指定为值 `2`。

**executionRoleArn **  
指定任务执行 IAM 角色，用于不同目的以及与账户关联的服务。为了让应用程序使用[作为密钥存储的 Elastic Beanstalk 环境变量](AWSHowTo.secrets.env-vars.md)，您需要指定用于授予所需权限的任务执行角色的 ARN。其他常见使用案例也可能需要此参数。有关更多信息，请参阅 [执行角色 ARN 格式](#create_deploy_docker_v2config_executionRoleArn_format)。

**卷**  
从 Amazon EC2 容器实例中的文件夹或从源包（部署到 `/var/app/current`）创建卷。使用 `containerDefinitions` 部分中的 `mountPoints` 将这些卷装载到您的 Docker 容器中的路径。

**containerDefinitions**  
容器定义数组。

**身份验证（可选）**  
包含私有存储库身份验证数据的 `.dockercfg` 文件在 Amazon S3 中的位置。

`Dockerrun.aws.json` 的 *containerDefinitions* 和*卷*部分使用的格式与 Amazon ECS 任务定义文件的相应部分使用的格式相同。有关任务定义格式和完整任务定义参数列表的更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的 [Amazon ECS 任务定义](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html)。

## 卷格式
<a name="create_deploy_docker_v2config_volume_format"></a>

*volume* 参数从 Amazon EC2 容器实例中的文件夹或从源包（部署到 `/var/app/current`）创建卷。

 用以下格式指定卷：

```
"volumes": [
    {
      "name": "volumename",
      "host": {
        "sourcePath": "/path/on/host/instance"
      }
    }
  ],
```

使用容器定义中的 `mountPoints`，将这些卷装载到您的 Docker 容器中的路径。

Elastic Beanstalk 为日志配置附加卷（为每个容器配置一个）。这些卷应由您的 Docker 容器装载，以便将日志写入主机实例。

有关更多详细信息，请参阅后面的*容器定义格式*部分中的 `mountPoints` 字段。

## 执行角色 ARN 格式
<a name="create_deploy_docker_v2config_executionRoleArn_format"></a>

为了让应用程序使用[作为密钥存储的 Elastic Beanstalk 环境变量](AWSHowTo.secrets.env-vars.md)，您需要指定任务执行 IAM 角色。该角色必须授予 Amazon ECS 容器使用 AWS Secrets Manager 密钥或 AWS Systems Manager 参数存储参数代表您进行 AWS API 调用的权限，以引用敏感数据。有关创建具有账户所需权限的任务执行 IAM 角色的更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》中的 [Amazon ECS 任务执行 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。

```
{
"AWSEBDockerrunVersion": 2,
  "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
```

### Amazon ECS 托管 Docker 平台所需的其他权限
<a name="create_deploy_docker_v2config_executionRoleArn_format_passRole"></a>

**EC2 实例配置文件向 ECS 授予 `iam:PassRole`**  
为了使 EC2 实例配置文件能够向 ECS 容器授予此角色，必须纳入以下示例所示的 `iam:PassRole` 权限。`iam:PassRole` 允许 EC2 实例权限将任务执行角色*传递给* ECS 容器。

在此示例中，我们将 EC2 实例限制为仅将角色传递给 ECS 服务。尽管此条件不是必需的，但我们还是添加了此条件，以遵循最佳实践，缩小共享权限的范围。我们用 `Condition` 元素来实现这一目标。

**注意**  
对 ECS IAM 任务执行角色的任何使用都需要 `iam:PassRole` 权限。还有其他需要使用 ECS 任务执行托管服务角色的常见使用案例。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》中的 [Amazon ECS 任务执行 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。



**Example 具有 `iam:PassRole` 权限的政策**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": [
                "arn:aws:iam::123456789012:role/ecs-task-execution-role"
            ],
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "ecs-tasks.amazonaws.com"
                }
            }
        }
    ]
}
```





**向 Amazon ECS 容器代理授予密钥和参数访问权限**  
Amazon ECS 任务执行 IAM 角色还需要密钥和参数存储库的访问权限。与 EC2 实例配置文件角色的要求类似，ECS 容器代理需要权限才能拉取必要的 Secrets Manager 或 Systems Manager 资源。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的 [Secrets Manager 或 Systems Manager 权限](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html#task-execution-secrets)

**向 Elastic Beanstalk EC2 实例授予密钥和参数的访问权限**  
要支持作为环境变量配置的密钥，您还需要向 EC2 实例配置文件添加权限。有关更多信息，请参阅[为 Elastic Beanstalk 环境变量获取密钥与参数](AWSHowTo.secrets.env-vars.md)和[Secrets Manager 所需的 IAM 权限](AWSHowTo.secrets.IAM-permissions.md#AWSHowTo.secrets.IAM-permissions.secrets-manager)。

以下示例将前面的 `iam:PassRole` 示例与参考的 [Secrets Manager 所需的 IAM 权限](AWSHowTo.secrets.IAM-permissions.md#AWSHowTo.secrets.IAM-permissions.secrets-manager)中提供的示例相结合。它们添加了 EC2 实例访问 AWS Secrets Manager 和 AWS Systems Manager 存储所需的权限，以检索机密和参数数据，以初始化为机密配置的 Elastic Beanstalk 环境变量。

**Example Secrets Manager 策略与 `iam:PassRole` 权限相结合**    
****  

```
{
    "Version": "2012-10-17",
    "Statement": [
       {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": [
                "arn:aws:iam::123456789012:role/ecs-task-execution-role"
            ],
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "ecs-tasks.amazonaws.com"
               }
            } 
        },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "kms:Decrypt"          
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret",
                "arn:aws:kms:us-east-1:111122223333:key/my-key"
            ]
        }
    ]
}
```

**Example Systems Manager 策略与 `iam:PassRole` 权限相结合**    
****  

```
{
    "Version": "2012-10-17",
    "Statement": [
       {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": [
                "arn:aws:iam::123456789012:role/ecs-task-execution-role"
            ],
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "ecs-tasks.amazonaws.com"
               }
            } 
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:ssm:us-east-1:111122223333:parameter/my-parameter",
                "arn:aws:kms:us-east-1:111122223333:key/my-key"
            ]
        }
    ]
}
```

## 容器定义格式
<a name="create_deploy_docker_v2config_dockerrun_format"></a>

以下示例显示 *containerDefinitions* 部分中常用参数的子集。将提供更多可选参数。

Beanstalk 平台创建 ECS *任务定义*，其中包括 ECS *容器定义*。Beanstalk 支持 ECS 容器定义的参数子集。有关更多信息，请参阅 *Amazon Elastic Container Service 开发人员指南*中的[容器定义](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definitions)。

`Dockerrun.aws.json` 文件包含一组 (一个或多个) 带以下字段的容器定义对象：

**name**  
容器的名称。有关最大长度和允许字符数的信息，请参阅[标准容器定义参数](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#standard_container_definition_params)。

**image**  
您从中构建 Docker 容器的在线 Docker 存储库中的 Docker 映像的名称。记下这些约定：  
+  Docker Hub 上的官方存储库中的映像使用一个名称 (例如，`ubuntu` 或 `mongo`)。
+ Docker Hub 上其他存储库中的映像通过组织名称 (例如，`amazon/amazon-ecs-agent`) 进行限定。
+ 其他在线存储库中的映像由域名 (例如，`quay.io/assemblyline/ubuntu`) 进行进一步限定。

**环境**  
一组要传递到容器的环境变量。  
例如，以下条目定义名称为 **Container** 且值为 **PHP** 的环境变量：  

```
"environment": [
  {
    "name": "Container",
    "value": "PHP"
  }
],
```

**essential**  
如果在容器出现故障时应停止任务，则为 true。非主要容器可在不影响实例上的其余容器的情况下完成或发生崩溃。

**memory**  
要为容器预留的容器实例上的内存量。在容器定义中为 `memory` 和/或 `memoryReservation` 参数指定一个非零整数。

**memoryReservation**  
要为容器预留的内存量的软限制（以 MiB 为单位）。在容器定义中为 `memory` 和/或 `memoryReservation` 参数指定一个非零整数。

**mountPoints**  
Amazon EC2 容器实例中要挂载的卷，以及 Docker 容器文件系统上要挂载这些卷的位置。如果您装载的卷中包含应用程序内容，您的容器能够读取您在源包中上传的数据。当您挂载日志卷以写入日志数据时，Elastic Beanstalk 可以从这些卷中收集日志数据。  
 Elastic Beanstalk 在 `/var/log/containers/containername` 处的容器实例上创建日志卷（为每个 Docker 容器创建一个日志卷）。这些卷将命名为 `awseb-logs-containername` 且将挂载到将日志写入到的容器文件结构中的位置。  
例如，以下挂载点将容器中的 nginx 日志位置映射到 Elastic Beanstalk 为 `nginx-proxy` 容器生成的卷。  

```
{
  "sourceVolume": "awseb-logs-nginx-proxy",
  "containerPath": "/var/log/nginx"
}
```

**portMappings**  
将容器上的网络端口映射到主机上的端口。

**links**  
要链接到的容器的列表。链接的容器可互相发现并安全地通信。

**volumesFrom**  
从不同容器装载所有卷。例如，从名为 `web` 的容器装载卷：  

```
"volumesFrom": [
  {
    "sourceContainer": "web"
  }
],
```

## 验证库格式 – 使用私有存储库中的映像
<a name="docker-multicontainer-dockerrun-privaterepo"></a>

`authentication` 部分包含私有存储库的身份验证数据。此条目是可选项。

在 `authentication` 文件的 `Dockerrun.aws.json` 参数中添加有关包含身份验证文件的 Amazon S3 存储桶的信息。确保 `authentication` 参数包含有效的 Amazon S3 存储桶和密钥。Amazon S3 存储桶必须托管在使用它的环境所在的区域中。Elastic Beanstalk 不会从托管在其他区域的 Amazon S3 存储桶下载文件。

使用下列格式：

```
"authentication": {
    "bucket": "amzn-s3-demo-bucket",
    "key": "mydockercfg"
  },
```

有关生成和上传身份验证文件的信息，请参阅 [映像存储库的身份验证使用 AWS Secrets Manager](docker-configuration.remote-repo.md)。

## 示例 Dockerrun.aws.json v2
<a name="create_deploy_docker_v2config_example"></a>

以下代码段是一个示例，该示例说明了带两个容器实例的 `Dockerrun.aws.json` 文件的语法。

```
{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
    {
      "name": "php-app",
      "host": {
        "sourcePath": "/var/app/current/php-app"
      }
    },
    {
      "name": "nginx-proxy-conf",
      "host": {
        "sourcePath": "/var/app/current/proxy/conf.d"
      }
    }
  ],
  "containerDefinitions": [
    {
      "name": "php-app",
      "image": "php:fpm",
      "environment": [
        {
          "name": "Container",
          "value": "PHP"
        }
      ],
      "essential": true,
      "memory": 128,
      "mountPoints": [
        {
          "sourceVolume": "php-app",
          "containerPath": "/var/www/html",
          "readOnly": true
        }
      ]
    },
    {
      "name": "nginx-proxy",
      "image": "nginx",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "links": [
        "php-app"
      ],
      "mountPoints": [
        {
          "sourceVolume": "php-app",
          "containerPath": "/var/www/html",
          "readOnly": true
        },
        {
          "sourceVolume": "nginx-proxy-conf",
          "containerPath": "/etc/nginx/conf.d",
          "readOnly": true
        },
        {
          "sourceVolume": "awseb-logs-nginx-proxy",
          "containerPath": "/var/log/nginx"
        }
      ]
    }
  ]
}
```