运行 Docker 容器 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

运行 Docker 容器

您可以将Amazon IoT Greengrass组件配置为使用存储在以下位置的映像运行 Docker 容器:

  • Amazon Elastic Container Registry (Amazon ECR) 中的公有和私有图像存储库

  • 公共 Docker Hub 存储库

  • 公共 Docker 可信注册表

  • S3 存储桶

在您的自定义组件中,将 Docker 镜像 URI 作为工件包括在内,以检索镜像并在核心设备上运行。对于 Amazon ECR 和 Docker Hub 镜像,您可以使用 Docker 应用程序管理器组件下载映像并管理私有 Amazon ECR 存储库的凭证。

要求

要在组件中运行 Docker 容器,你需要以下内容:

  • 一款 Greengrass 核心设备。如果没有,请参阅教程:Amazon IoT Greengrass V2 入门

  • 安装在 Greengr@@ ass 核心设备上的 Docker E ngine 1.9.1 或更高版本。版本 20.10 是经验证可与Amazon IoT Greengrass核心软件配合使用的最新版本。在部署运行 Docker 容器的组件之前,必须直接在核心设备上安装 Docker。

    提示

    您还可以将核心设备配置为在组件安装时安装 Docker Engine。例如,以下安装脚本在加载 Docker 镜像之前安装 Docker 引擎。此安装脚本适用于基于 Debian 的 Linux 发行版,例如 Ubuntu。如果您使用此命令将组件配置为安装 Docker Engine,则可能需要在生命周期脚本true中将其设置RequiresPrivilege为才能运行安装和docker命令。有关更多信息,请参阅 Amazon IoT Greengrass组件配方参考

    apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/hello-world.tar
  • 运行 Docker 容器组件的系统用户必须具有根或管理员权限,或者您必须将 Docker 配置为以非根用户或非管理员用户身份运行。

    • 在 Linux 设备上,您可以将用户添加到docker群组中,无需用户即可调用docker命令sudo

    • 在 Windows 设备上,无需管理员权限即可将用户添加到docker-users群组中以调用docker命令。

    Linux or Unix

    要将或用于运行 Docker 容器组件的非 root 用户添加到ggc_userdocker群组,请运行以下命令。

    sudo usermod -aG docker ggc_user

    有关更多信息,请参阅以非 root 用户身份管理 Docker

    Windows Command Prompt (CMD)

    要将或您用来运行 Docker 容器组件的用户添加到ggc_userdocker-users群组,请以管理员身份运行以下命令。

    net localgroup docker-users ggc_user /add
    Windows PowerShell

    要将或您用来运行 Docker 容器组件的用户添加到ggc_userdocker-users群组,请以管理员身份运行以下命令。

    Add-LocalGroupMember -Group docker-users -Member ggc_user
  • 作为卷安装在 Docker 容器中的 Docker 容器组件访问的文件。

  • 如果您将 Amazon IoT Greengrass Core 软件配置为使用网络代理,则必须将 Docker 配置为使用相同的代理服务器

除了这些要求外,如果这些要求适用于您的环境,则还必须满足以下要求:

  • 要使用 Docker Compose 创建和启动 Docker 容器,请在 Greengrass 核心设备上安装 Docker Compose,然后将你的 Docker Compose 文件上传到 S3 存储桶。您必须将 Compose 文件存储在Amazon Web Services 账户与Amazon Web Services 区域组件相同的 S3 存储桶中。有关在自定义组件中使用该docker-compose up命令的示例,请参阅在 Amazon ECR 或 Docker Hub 中使用公共镜像运行 Docker 容器

  • 如果您在网络代理Amazon IoT Greengrass后面运行,请将 Docker 守护程序配置为使用代理服务器

  • 如果您的 Docker 镜像存储在 Amazon ECR 或 Docker Hub 中,请将 Docker 组件管理器组件作为依赖项包含在 Docker 容器组件中。在部署组件之前,必须在核心设备上启动 Docker 守护程序。

    此外,还要将图像 URI 作为组件工件包括在内。图片 URI 必须采用以下示例docker:registry/image[:tag|@digest]所示的格式:

    • 亚马逊 ECR 的私有图片:docker:account-id.dkr.ecr.region.amazonaws.com/repository/image[:tag|@digest]

    • 公开 Amazon ECR 图片:docker:public.ecr.aws/repository/image[:tag|@digest]

    • 公共 Docker Hub 镜像:docker:name[:tag|@digest]

    有关使用存储在公共存储库中的镜像运行 Docker 容器的更多信息,请参阅在 Amazon ECR 或 Docker Hub 中使用公共镜像运行 Docker 容器

  • 如果您的 Docker 镜像存储在 Amazon ECR 私有存储库中,则必须将令牌交换服务组件作为依赖项包含在 Docker 容器组件中。此外,Greengrass 设备角色必须允许、ecr:GetDownloadUrlForLayer和操作ecr:BatchGetImage,如ecr:GetAuthorizationToken以下示例 IAM 策略所示。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

    有关使用存储在 Amazon ECR 私有存储库中的映像运行 Docker 容器的信息,请参阅。使用亚马逊 ECR 中的私有镜像运行 Docker 容器

  • 要使用存储在 Amazon ECR 私有存储库中的 Docker 映像,私有存储库必须与核心设备位于同一Amazon Web Services 区域位置。

  • 如果您的 Docker 映像或 Compose 文件存储在 S3 存储桶中,则 Greengrass 设备角色必须允许核心设备将图像下载为组件工件,如以下示例 IAM 策略所示。s3:GetObject

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

    有关使用存储在 Amazon S3 中的映像运行 Docker 容器的信息,请参阅使用亚马逊 S3 中的镜像运行 Docker 容器

  • 要在 Docker 容器组件中使用进程间通信 (IPC)、Amazon凭据或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:

在 Amazon ECR 或 Docker Hub 中使用公共镜像运行 Docker 容器

本节介绍如何创建自定义组件,该组件使用 Docker Compose 从存储在 Amazon ECR 和 Docker Hub 的 Docker 镜像中运行 Docker 容器。

使用 Docker Compose 运行 Docker 容器
  1. 创建 Docker Compose 文件并将其上传到亚马逊 S3 存储桶。确保 Greengrass 设备角色允许设备访问 C s3:GetObject ompose 文件。以下示例中显示的示例撰写文件包括来自亚马逊 ECR 的亚马逊 CloudWatch 代理镜像和来自 Docker Hub 的 MySQL 镜像。

    version: "3" services: cloudwatchagent: image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" mysql: image: "mysql:8.0"
  2. 在Amazon IoT Greengrass核心设备上创建自定义组件。以下示例中显示的示例配方具有以下属性:

    • Docker 应用程序管理器组件作为依赖项。该组件Amazon IoT Greengrass允许从公共 Amazon ECR 和 Docker Hub 存储库下载映像。

    • 一个组件工件,用于在公共 Amazon ECR 存储库中指定 Docker 镜像。

    • 一种组件工件,用于在公共 Docker Hub 存储库中指定 Docker 镜像。

    • 一个组件工件,它指定 Docker Compose 文件,该文件包含你要运行的 Docker 镜像的容器。

    • 一个生命周期运行脚本,它使用 docker-compose up 从指定的映像创建和启动容器。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyDockerComposeComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "run": "docker-compose -f {artifacts:path}/docker-compose.yaml up" }, "Artifacts": [ { "URI": "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" }, { "URI": "docker:mysql:8.0" }, { "URI": "s3://DOC-EXAMPLE-BUCKET/folder/docker-compose.yaml" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyDockerComposeComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 Manifests: - Platform: os: all Lifecycle: run: docker-compose -f {artifacts:path}/docker-compose.yaml up Artifacts: - URI: "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" - URI: "docker:mysql:8.0" - URI: "s3://DOC-EXAMPLE-BUCKET/folder/docker-compose.yaml"
    注意

    要在 Docker 容器组件中使用进程间通信 (IPC)、Amazon凭据或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:

  3. 测试组件以验证其是否按预期工作。

    重要

    在部署组件之前,必须安装并启动 Docker 守护程序。

    在本地部署组件后,您可以运行 docker 容器 ls 命令来验证您的容器是否运行。

    docker container ls
  4. 组件准备就绪后,将该组件上传Amazon IoT Greengrass到以部署到其他核心设备。有关更多信息,请参阅 发布组件以部署到您的核心设备

使用亚马逊 ECR 中的私有镜像运行 Docker 容器

本节介绍如何使用存储在 Amazon ECR 私有存储库中的 Docker 映像创建运行 Docker 容器的自定义组件。

运行 Docker 容器
  1. 在Amazon IoT Greengrass核心设备上创建自定义组件。使用以下示例配方,它具有以下属性:

    • Docker 应用程序管理器组件作为依赖项。此组件Amazon IoT Greengrass允许管理从私有存储库下载图像的凭据。

    • 作为依赖项的令牌交换服务组件。此组件允许检索Amazon凭证Amazon IoT Greengrass以与 Amazon ECR 进行交互。

    • 一个组件工件,用于在私有 Amazon ECR 存储库中指定 Docker 镜像。

    • 生命周期运行脚本,使用 docker run 从镜像创建和启动容器。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyPrivateDockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from a private Amazon ECR image.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" }, "aws.greengrass.TokenExchangeService": { "VersionRequirement": "~2.0.0" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "run": "docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" }, "Artifacts": [ { "URI": "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyPrivateDockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from a private Amazon ECR image.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 aws.greengrass.TokenExchangeService: VersionRequirement: ~2.0.0 Manifests: - Platform: os: all Lifecycle: run: docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest] Artifacts: - URI: "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
    注意

    要在 Docker 容器组件中使用进程间通信 (IPC)、Amazon凭据或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:

  2. 测试组件以验证其是否按预期工作。

    重要

    在部署组件之前,必须安装并启动 Docker 守护程序。

    在本地部署组件后,您可以运行 docker 容器 ls 命令来验证您的容器是否运行。

    docker container ls
  3. 将组件上传到Amazon IoT Greengrass以部署到其他核心设备。有关更多信息,请参阅 发布组件以部署到您的核心设备

使用亚马逊 S3 中的镜像运行 Docker 容器

本节介绍如何通过存储在亚马逊 S3 中的 Docker 镜像在组件中运行 Docker 容器。

通过亚马逊 S3 中的镜像在组件中运行 Docker 容器
  1. 运行 docker save 命令创建 Docker 容器的备份。您可以将此备份作为组件工件提供来运行容器Amazon IoT Greengrass。将 hello-wor ld 替换为图像的名称,将 hello-world.tar 替换为要创建的存档文件的名称。

    docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
  2. 在Amazon IoT Greengrass核心设备上创建自定义组件。使用以下示例配方,它具有以下属性:

    • 一种生命周期安装脚本,它使用 docker 加载从存档中加载 Docker 镜像。

    • 生命周期运行脚本,使用 docker run 从镜像创建和启动容器。该--rm选项会在容器退出时对其进行清理。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyS3DockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.", "ComponentPublisher": "Amazon", "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "run": { "Script": "docker run --rm hello-world" } } } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyS3DockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.' ComponentPublisher: Amazon Manifests: - Platform: os: linux Lifecycle: install: Script: docker load -i {artifacts:path}/hello-world.tar run: Script: docker run --rm hello-world
    注意

    要在 Docker 容器组件中使用进程间通信 (IPC)、Amazon凭据或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:

  3. 测试组件以验证其是否按预期工作。

    在本地部署组件后,您可以运行 docker 容器 ls 命令来验证您的容器是否运行。

    docker container ls
  4. 组件准备就绪后,将 Docker 映像存档上传到 S3 存储桶,然后将其 URI 添加到组件配方中。然后,您可以将组件上传到Amazon IoT Greengrass以部署到其他核心设备。有关更多信息,请参阅 发布组件以部署到您的核心设备

    完成后,组件配方应类似于以下示例。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyS3DockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.", "ComponentPublisher": "Amazon", "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "run": { "Script": "docker run --rm hello-world" } }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyS3DockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.' ComponentPublisher: Amazon Manifests: - Platform: os: linux Lifecycle: install: Script: docker load -i {artifacts:path}/hello-world.tar run: Script: docker run --rm hello-world Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar

在 Docker 容器组件中使用进程间通信

您可以使用中的 Greengrass 进程间通信 (IPC) 库与 Greengrass 核、Amazon IoT Device SDK其他 Greengrass 组件以及进行通信。Amazon IoT Core有关更多信息,请参阅 使用Amazon IoT Device SDK与 Greengrass 原子核、其他组件进行通信 Amazon IoT Core

要在 Docker 容器组件中使用 IPC,必须使用以下参数运行 Docker 容器:

  • 将 IPC 插槽安装在容器中。Greengrass nucleus 在环境变量中提供 IPC 套接字文件路径。AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT

  • SVCUIDAWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT环境变量设置为 Greengrass 核为组件提供的值。您的组件使用这些环境变量来验证与 Greengrass 核的连接。

例 示例配方:将 MQTT 消息发布到 Amazon IoT Core (Python)

以下配方定义了一个将 MQTT 消息发布到的 Docker 容器组件示例。Amazon IoT Core该配方具有以下属性:

  • 一种授权策略 (accessControl),允许组件向其发布Amazon IoT Core有关所有主题的 MQTT 消息。有关更多信息,请参阅授权组件执行 IPC 操作Amazon IoT CoreMQTT IPC 授权

  • 一个组件工件,它将 Docker 镜像指定为 Amazon S3 中的 TAR 存档。

  • 从 TAR 存档中加载 Docker 镜像的生命周期安装脚本。

  • 基于镜像运行 Docker 容器的生命周期运行脚本。D ocker 运行命令具有以下参数:

    • -v参数将 Greengrass IPC 套接字安装在容器中。

    • 前两个-e参数在 Docker 容器中设置所需的环境变量。

    • 其他-e参数设置了本示例使用的环境变量。

    • --rm参数会在容器退出时清理容器。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.PublishToIoTCore", "ComponentVersion": "1.0.0", "ComponentDescription": "Uses interprocess communication to publish an MQTT message to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "topic": "test/topic/java", "message": "Hello, World!", "qos": "1", "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.python.docker.PublishToIoTCore:pubsub:1": { "policyDescription": "Allows access to publish to IoT Core on all topics.", "operations": [ "aws.greengrass#PublishToIoTCore" ], "resources": [ "*" ] } } } } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/publish-to-iot-core.tar", "run": "docker run -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e SVCUID -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e MQTT_TOPIC=\"{configuration:/topic}\" -e MQTT_MESSAGE=\"{configuration:/message}\" -e MQTT_QOS=\"{configuration:/qos}\" --rm publish-to-iot-core" }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.PublishToIoTCore ComponentVersion: 1.0.0 ComponentDescription: Uses interprocess communication to publish an MQTT message to IoT Core. ComponentPublisher: Amazon ComponentConfiguration: DefaultConfiguration: topic: 'test/topic/java' message: 'Hello, World!' qos: '1' accessControl: aws.greengrass.ipc.mqttproxy: 'com.example.python.docker.PublishToIoTCore:pubsub:1': policyDescription: Allows access to publish to IoT Core on all topics. operations: - 'aws.greengrass#PublishToIoTCore' resources: - '*' Manifests: - Platform: os: all Lifecycle: install: 'docker load -i {artifacts:path}/publish-to-iot-core.tar' run: | docker run \ -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \ -e SVCUID \ -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \ -e MQTT_TOPIC="{configuration:/topic}" \ -e MQTT_MESSAGE="{configuration:/message}" \ -e MQTT_QOS="{configuration:/qos}" \ --rm publish-to-iot-core Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar

在 Docker 容器组件中使用Amazon凭证 (Linux)

您可以使用令牌交换服务组件与 Greengrass 组件中的Amazon服务进行交互。该组件使用本地容器服务器提供来自核心设备的令牌交换角色的Amazon凭证。有关更多信息,请参阅 与Amazon服务互动

注意

本节中的示例仅适用于 Linux 核心设备。

要在 Docker 容器组件中使用来自令牌交换服务的Amazon凭证,必须使用以下参数运行 Docker 容器:

  • 使用--network=host参数提供对主机网络的访问权限。此选项使 Docker 容器能够连接到本地令牌交换服务以检索Amazon凭据。这个参数仅适用于适用于 Linux 的 Docker。

    警告

    此选项允许容器访问主机上的所有本地网络接口,因此,与在没有主机网络访问权限的情况下运行 Docker 容器相比,此选项不那么安全。在开发和运行使用此选项的 Docker 容器组件时,请考虑这一点。有关更多信息,请参阅 Docker 文档中的网络:主机

  • AWS_CONTAINER_CREDENTIALS_FULL_URIAWS_CONTAINER_AUTHORIZATION_TOKEN环境变量设置为 Greengrass 核为组件提供的值。 AmazonSDK 使用这些环境变量来检索Amazon证书。

例 示例配方:在 Docker 容器组件中列出 S3 存储桶 (Python)

以下配方定义了一个示例 Docker 容器组件,该组件列出了你的 S3 存储桶。Amazon Web Services 账户该配方具有以下属性:

  • 作为依赖项的令牌交换服务组件。这种依赖关系使组件能够检索Amazon凭证以与其他Amazon服务进行交互。

  • 一个组件工件,它将 Docker 镜像指定为 Amazon S3 中的 tar 存档。

  • 从 TAR 存档中加载 Docker 镜像的生命周期安装脚本。

  • 基于镜像运行 Docker 容器的生命周期运行脚本。D ocker 运行命令具有以下参数:

    • --network=host参数提供容器对主机网络的访问权限,因此容器可以连接到令牌交换服务。

    • -e参数在 Docker 容器中设置所需的环境变量。

    • --rm参数会在容器退出时清理容器。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.ListS3Buckets", "ComponentVersion": "1.0.0", "ComponentDescription": "Uses the token exchange service to lists your S3 buckets.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.TokenExchangeService": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/list-s3-buckets.tar", "run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e AWS_CONTAINER_CREDENTIALS_FULL_URI --rm list-s3-buckets" }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.ListS3Buckets ComponentVersion: 1.0.0 ComponentDescription: Uses the token exchange service to lists your S3 buckets. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.TokenExchangeService: VersionRequirement: ^2.0.0 DependencyType: HARD Manifests: - Platform: os: linux Lifecycle: install: 'docker load -i {artifacts:path}/list-s3-buckets.tar' run: | docker run \ --network=host \ -e AWS_CONTAINER_AUTHORIZATION_TOKEN \ -e AWS_CONTAINER_CREDENTIALS_FULL_URI \ --rm list-s3-buckets Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar

在 Docker 容器组件中使用流管理器 (Linux)

您可以使用流管理器组件来管理 Greengrass 组件中的数据流。此组件使您能够处理数据流并将大量物联网数据传输到. Amazon Web Services 云 Amazon IoT Greengrass提供了用于与流管理器组件交互的流管理器 SDK。有关更多信息,请参阅 管理 Greengrass 核心设备上的数据流

注意

本节中的示例仅适用于 Linux 核心设备。

要在 Docker 容器组件中使用流管理器 SDK,必须使用以下参数运行 Docker 容器:

  • 使用--network=host参数提供对主机网络的访问权限。此选项使 Docker 容器能够通过本地 TLS 连接与流管理器组件进行交互。这个参数仅适用于适用于 Linux 的 Docker

    警告

    此选项允许容器访问主机上的所有本地网络接口,因此,与在没有主机网络访问权限的情况下运行 Docker 容器相比,此选项不那么安全。在开发和运行使用此选项的 Docker 容器组件时,请考虑这一点。有关更多信息,请参阅 Docker 文档中的网络:主机

  • 如果您将流管理器组件配置为需要身份验证(这是默认行为),请将AWS_CONTAINER_CREDENTIALS_FULL_URI环境变量设置为 Greengrass nucleus 为组件提供的值。有关更多信息,请参阅直播管理器配置

  • 如果将流管理器组件配置为使用非默认端口,请使用进程间通信 (IPC) 从流管理器组件配置中获取该端口。要使用 IPC,您必须使用其他选项运行 Docker 容器。有关更多信息,请参阅下列内容:

例 示例配方:将文件流式传输到 Docker 容器组件中的 S3 存储桶 (Python)

以下配方定义了一个示例 Docker 容器组件,该组件用于创建文件并将其流式传输到 S3 存储桶。该配方具有以下属性:

  • 作为依赖项的流管理器组件。这种依赖关系使该组件能够使用流管理器 SDK 与流管理器组件进行交互。

  • 一个组件工件,它将 Docker 镜像指定为 Amazon S3 中的 TAR 存档。

  • 从 TAR 存档中加载 Docker 镜像的生命周期安装脚本。

  • 基于镜像运行 Docker 容器的生命周期运行脚本。D ocker 运行命令具有以下参数:

    • --network=host参数提供容器对主机网络的访问权限,因此容器可以连接到流管理器组件。

    • 第一个-e参数在 Docker 容器中设置所需的AWS_CONTAINER_AUTHORIZATION_TOKEN环境变量。

    • 其他-e参数设置了本示例使用的环境变量。

    • -v参数将组件的工作文件夹挂载到容器中。此示例在工作文件夹中创建一个文件,以便使用流管理器将该文件上传到 Amazon S3。

    • --rm参数会在容器退出时清理容器。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.StreamFileToS3", "ComponentVersion": "1.0.0", "ComponentDescription": "Creates a text file and uses stream manager to stream the file to S3.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.StreamManager": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "ComponentConfiguration": { "DefaultConfiguration": { "bucketName": "" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/stream-file-to-s3.tar", "run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e BUCKET_NAME=\"{configuration:/bucketName}\" -e WORK_PATH=\"{work:path}\" -v {work:path}:{work:path} --rm stream-file-to-s3" }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.StreamFileToS3 ComponentVersion: 1.0.0 ComponentDescription: Creates a text file and uses stream manager to stream the file to S3. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.StreamManager: VersionRequirement: ^2.0.0 DependencyType: HARD ComponentConfiguration: DefaultConfiguration: bucketName: '' Manifests: - Platform: os: linux Lifecycle: install: 'docker load -i {artifacts:path}/stream-file-to-s3.tar' run: | docker run \ --network=host \ -e AWS_CONTAINER_AUTHORIZATION_TOKEN \ -e BUCKET_NAME="{configuration:/bucketName}" \ -e WORK_PATH="{work:path}" \ -v {work:path}:{work:path} \ --rm stream-file-to-s3 Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar