

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 Dockerrun.aws.json v2 檔案
<a name="create_deploy_docker_v2config"></a>

`Dockerrun.aws.json v2` 為 Elastic Beanstalk 組態檔案，會說明如何部署於 Elastic Beanstalk 環境之 ECS 叢集中託管的 Docker 容器組。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` 檔案包含下列章節：

**AWSEBDockerrunVersion**  
將 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>

*磁碟區*參數會從 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 執行個體描述檔`iam:PassRole`授予 ECS**  
為了讓您的 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`)。

**environment**  
傳遞至容器的環境變數陣列。  
例如，下列項目會定義名稱為 **Container** 且值為 **PHP** 的環境變數：  

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

**essential**  
若容器故障則應停止任務，則此值為 True。非基本容器完成或當機，不會影響執行個體上的其他容器。

**memory**  
在容器執行個體上為容器預留的記憶體容量。為容器定義內 `memory` 或 `memoryReservation` 兩者參數中的其中一項，指定非零的整數。

**memoryReservation**  
為容器保留的記憶體軟性限制 (MiB)。為容器定義內 `memory` 或 `memoryReservation` 兩者參數中的其中一項，指定非零的整數。

**mountPoints**  
欲自 Amazon EC2 容器執行個體掛載的磁碟區，以及 Docker 容器檔案系統掛載磁碟區的位置。當您掛載內含應用程式內容的磁碟區，您的容器可讀取原始碼套件內上傳的資料。當您掛載日誌磁碟區進行日誌資料寫入，Elastic Beanstalk 可自這些磁碟區收集日誌資料。  
 Elastic Beanstalk 會在容器執行個體上建立日誌磁碟區 (每個 Docker 容器一個)，路徑為 `/var/log/containers/{{containername}}`。這些磁碟區名為 `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` 區段包含私有儲存庫的驗證資料。此為選用項目。

將內含身分驗證檔案的 Amazon S3 儲存貯體相關資訊，新增至 `authentication` 檔案的 `Dockerrun.aws.json` 參數。請確認 `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"
        }
      ]
    }
  ]
}
```