

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

# 从 Dockerfile 中构建 AWS IoT Greengrass 容器镜像
<a name="build-greengrass-dockerfile"></a>

AWS 提供了一个 Dockerfile，你可以下载并使用它来在 Docker AWS IoT Greengrass 容器中运行核心软件。Dockerfiles 包含用于构建 AWS IoT Greengrass 容器镜像的源代码。

在构建 AWS IoT Greengrass 容器镜像之前，必须配置 Dockerfile 以选择要安装的 AWS IoT Greengrass 核心软件版本。您还可以配置环境变量以选择在安装过程中如何配置资源，并自定义其他安装选项。本节介绍如何从 Dockerfile 配置和构建 AWS IoT Greengrass Docker 镜像。



## 下载 Dockerfile 包
<a name="download-dockerfile-package"></a>

你可以从以下网址下载 AWS IoT Greengrass Dockerfile 软件包： GitHub

[AWS Greengrass Docker 存储库](https://github.com/aws-greengrass/aws-greengrass-docker)

下载包后，将内容解提取到计算机上的 `download-directory/aws-greengrass-docker-nucleus-version` 文件夹。Dockerfile 使用的是旧版本的 Greengrass。您应该更新文件，以使用您需要的 Greengrass 版本。

## 指定 AWS IoT Greengrass 核心软件版本
<a name="set-dockerfile-build-argument"></a>

在 Dockerfile 中使用以下构建参数来指定要在 Doc AWS IoT Greengrass ker 镜像中使用的 AWS IoT Greengrass 核心软件的版本。默认情况下，Dockerfile 使用最新版本的 AWS IoT Greengrass 核心软件。

`GREENGRASS_RELEASE_VERSION`  
 AWS IoT Greengrass 核心软件的版本。默认情况下，Dockerfile 会下载 Greengrass Nucleus 的最新可用版本。将值设置为您要下载的 Nucleus 的版本。

## 设置环境变量
<a name="set-dockerfile-environment-variables"></a>

环境变量使您可以自定义 C AWS IoT Greengrass ore 软件在 Docker 容器中的安装方式。您可以通过多种方式为 AWS IoT Greengrass Docker 镜像设置环境变量。
+ 要使用相同的环境变量来创建多个映像，请直接在 Dockerfile 中设置环境变量。
+ 如果您使用 `docker run` 启动容器，请在命令中将环境变量作为参数进行传递，或者在环境变量文件中设置环境变量，然后将该文件作为参数进行传递。有关在 Docker 中设置环境变量的更多信息，请参阅 Docker 文档中的[环境变量](https://docs.docker.com/engine/reference/commandline/run/#env)。
+ 如果您使用 `docker-compose up` 启动容器，请在环境变量文件中设置环境变量，然后将该文件作为参数进行传递。有关在 Compose 中设置环境变量的更多信息，请参阅 [Docker 文档](https://docs.docker.com/compose/environment-variables/)。

您可以为 AWS IoT Greengrass Docker 镜像配置以下环境变量。

**注意**  
不要修改 Dockerfile 中的 `TINI_KILL_PROCESS_GROUP` 变量。此变量允许转发`SIGTERM`给 PID 组 PIDs 中的所有人，这样 C AWS IoT Greengrass ore 软件就可以在 Docker 容器停止时正确关闭。

`GGC_ROOT_PATH`  
（可选）容器内用作 AWS IoT Greengrass 核心软件根目录的文件夹的路径。  
默认值：`/greengrass/v2`

`PROVISION`  
（可选）确定 AWS IoT Greengrass 核心是否提供 AWS 资源。  
+ 如果您指定`true`， AWS IoT Greengrass Core 软件会将容器镜像注册为 AWS IoT 事物，并配置 Greengrass 核心设备 AWS 所需的资源。 AWS IoT Greengrass Core 软件预置 AWS IoT 事物、（可选） AWS IoT 事物组、IAM 角色和 AWS IoT 角色别名。有关更多信息，请参阅 [AWS IoT Greengrass 在具有自动资源配置功能的 Docker 容器中运行](run-greengrass-docker-automatic-provisioning.md)。
+ 如果您指定`false`，则必须创建一个配置文件以提供给 AWS IoT Greengrass Core 安装程序，该文件指定使用您手动创建的 AWS 资源和证书。有关更多信息，请参阅 [AWS IoT Greengrass 在 Docker 容器中运行，手动配置资源](run-greengrass-docker-manual-provisioning.md)。
默认值：`false`

`AWS_REGION`  
（可选） AWS IoT Greengrass Core 软件用于检索或创建所需 AWS 资源的。 AWS 区域   
默认值：`us-east-1`。

`THING_NAME`  
（可选）您注册为该核心设备的设备名称。 AWS IoT 如果你的名字中不存在带有这个名字的东西 AWS 账户， AWS IoT Greengrass Core 软件就会创建它。  
您必须指定 `PROVISION=true` 才能应用此参数。  
默认值：`GreengrassV2IotThing_` 加一个随机 UUID。

`THING_GROUP_NAME`  
（可选）在其中添加此核心设备 AWS IoT 的事物组的名称。 AWS IoT 如果部署以该事物组为目标，则该设备和该组中的其他核心设备在连接到时会收到该部署 AWS IoT Greengrass。如果您中不存在具有此名称的事物组 AWS 账户，则 AWS IoT Greengrass Core 软件会创建它。  
您必须指定 `PROVISION=true` 才能应用此参数。

`TES_ROLE_NAME`  
（可选）用于获取允许 Greengrass 核心设备与服务交互的 AWS 证书的 IAM 角色名称。 AWS 如果您的角色中不存在具有此名称的角色 AWS 账户，则 AWS IoT Greengrass 核心软件会使用`GreengrassV2TokenExchangeRoleAccess`策略创建该角色。此角色无权访问您用于托管组件构件的 S3 存储桶。因此，在创建组件时，您必须为构件的 S3 存储桶和对象添加权限。有关更多信息，请参阅 [授权核心设备与 AWS 服务交互](device-service-role.md)。  
默认值：`GreengrassV2TokenExchangeRole`

`TES_ROLE_ALIAS_NAME`  
（可选）指向 IAM AWS IoT 角色的角色别名的名称，该角色为 Greengrass 核心设备提供 AWS 证书。如果您的中不存在具有此名称的角色别名 AWS 账户，则 AWS IoT Greengrass Core 软件会创建该别名并将其指向您指定的 IAM 角色。  
默认值：`GreengrassV2TokenExchangeRoleAlias`

`COMPONENT_DEFAULT_USER`  
（可选） AWS IoT Greengrass 核心软件用于运行组件的系统用户和组的名称或 ID。指定用户和组，用冒号分隔。组是可选的。举例来说，可以指定 **ggc\$1user:ggc\$1group** 或 **ggc\$1user**。  
+ 如果您以根用户身份运行，则默认为配置文件定义的用户和组。如果配置文件未定义用户和组，则默认为 `ggc_user:ggc_group`。如果 `ggc_user` 或 `ggc_group` 不存在，则软件将自行创建。
+ 如果您以非 root 用户身份运行，则 AWS IoT Greengrass Core 软件将使用该用户来运行组件。
+ 如果您未指定组，则 AWS IoT Greengrass Core 软件将使用系统用户的主组。
有关更多信息，请参阅 [配置运行组件的用户](configure-greengrass-core-v2.md#configure-component-user)。

`DEPLOY_DEV_TOOLS`  
定义是否在容器映像中下载和部署 [Greengrass CLI 组件](greengrass-cli-component.md)。您可以使用 Greengrass CLI 在本地开发和调试组件。  
 <a name="local-dev-tools-production-environment-warning"></a>我们建议您仅在开发环境中使用此组件，不要在生产环境中使用。此组件允许访问您在生产环境中通常不需要的信息和操作。遵循最低权限原则，将此组件仅部署到有需求的核心设备。
默认值：`false`

`INIT_CONFIG`  
（可选）用于安装 AWS IoT Greengrass 核心软件的配置文件的路径。例如，您可以使用此选项来设置具有特定内核配置的新 Greengrass 核心设备，或者指定手动预置的资源。您必须将配置文件装载到此参数中指定的路径。

`TRUSTED_PLUGIN`  
此功能适用于 [Greengrass Nucleus 组件](greengrass-nucleus-component.md)的 v2.4.0 及更高版本。  
（可选）要作为可信插件加载的 JAR 文件的路径。使用此选项可提供预置插件 JAR 文件，例如使用[队列预置](fleet-provisioning.md)或[自定义预置](custom-provisioning.md)进行安装。

`THING_POLICY_NAME`  
此功能适用于 [Greengrass Nucleus 组件](greengrass-nucleus-component.md)的 v2.4.0 及更高版本。  
（可选）要附加到该核心设备 AWS IoT 的事物证书的 AWS IoT 策略名称。如果您的 Core 软件中不存在带有此名称的 AWS IoT 策略，则 AWS 账户 该策略将由 AWS IoT Greengrass 核心软件创建。  
您必须指定 `PROVISION=true` 才能应用此参数。  
默认情况下， AWS IoT Greengrass Core 软件会创建宽松 AWS IoT 策略。您可以缩小此策略的范围，也可以创建自定义策略来限制使用案例的权限。有关更多信息，请参阅 [AWS IoT Greengrass V2 核心设备的最低 AWS IoT 政策](device-auth.md#greengrass-core-minimal-iot-policy)。

## 指定要安装的依赖关系
<a name="dockerfile-run-instruction"></a>

 AWS IoT Greengrass Dockerfile 中的 RUN 指令为运行 AWS IoT Greengrass 核心软件安装程序做好了容器环境的准备。在 AWS IoT Greengrass Core 软件安装程序在 Docker 容器中运行之前，您可以自定义安装的依赖关系。

## 构建 AWS IoT Greengrass 镜像
<a name="build-greengrass-docker-image"></a>

使用 AWS IoT Greengrass Dockerfile 来构建 AWS IoT Greengrass 容器镜像。您可以使用 Docker CLI 或 Docker Compose CLI 来构建映像并启动容器。您还可以使用 Docker CLI 来构建映像，然后使用 Docker Compose 从该映像启动您的容器。

------
#### [ Docker ]

1. 在主机上，运行以下命令以切换到包含已配置 Dockerfile 的目录。

   ```
   cd download-directory/aws-greengrass-docker-nucleus-version
   ```

1. 运行以下命令从 Dockerfile 构建 AWS IoT Greengrass 容器镜像。

   ```
   sudo docker build -t "platform/aws-iot-greengrass:nucleus-version" ./
   ```

------
#### [ Docker Compose ]

1. 在主机上，运行以下命令以切换到包含 Dockerfile 和 Compose 文件的目录。

   ```
   cd download-directory/aws-greengrass-docker-nucleus-version
   ```

1. 运行以下命令以使用 Compose 文件构建 AWS IoT Greengrass 容器镜像。

   ```
   docker-compose -f docker-compose.yml build
   ```

------

您已成功创建 AWS IoT Greengrass 容器镜像。Docker 镜像安装了 AWS IoT Greengrass 核心软件。现在，您可以在 Docker 容器中运行 AWS IoT Greengrass 核心软件。