本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
运行 Docker 容器
您可以将 AWS IoT Greengrass 组件配置为使用存储在以下位置的映像运行 Docker 容器:
在您的自定义组件中,将 Docker 映像 URI 作为构件包括在内,以检索映像并在核心设备上运行。对于 Amazon ECR 和 Docker Hub 映像,您可以使用 Docker 应用程序管理器组件下载映像并管理私有 Amazon ECR 存储库的凭证。
要求
要在组件中运行 Docker 容器,您需要:
-
Greengrass 核心设备。如果没有,请参阅教程:入门 AWS IoT Greengrass V2。
-
Greengrass 核心设备上安装的 Docker Engine 1.9.1 或更高版本。版本 20.10 是经验证可与 AWS IoT Greengrass 核心软件配合使用的最新版本。在部署运行 Docker 容器的组件之前,必须直接在核心设备上安装 Docker。
您还可以将核心设备配置为在组件安装时安装 Docker Engine。例如,以下安装脚本可在加载 Docker 映像之前安装 Docker Engine。此安装脚本适用于基于 Debian 的 Linux 发行版,例如 Ubuntu。如果您使用此命令将组件配置为安装 Docker Engine,则可能需要在生命周期脚本中将 RequiresPrivilege 设置为 true 才能运行安装和 docker 命令。有关更多信息,请参阅 AWS IoT Greengrass 组件配方参考。
apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/hello-world.tar
-
运行 Docker 容器组件的系统用户必须具有根或管理员权限,或者您必须将 Docker 配置为以非根用户或非管理员用户身份运行。
- Linux or Unix
-
要添加 ggc_user 或您用于运行 Docker 容器组件的非根用户至 docker 组中,请运行以下命令:
sudo usermod -aG docker ggc_user
有关更多信息,请参阅以非根用户身份管理 Docker。
- Windows Command Prompt (CMD)
-
要添加 ggc_user 或您用于运行 Docker 容器组件的非根用户至 docker-users 组中,请以管理员身份运行以下命令:
net localgroup docker-users ggc_user /add
- Windows PowerShell
-
要添加 ggc_user 或您用于运行 Docker 容器组件的非根用户至 docker-users 组中,请以管理员身份运行以下命令:
Add-LocalGroupMember -Group docker-users -Member ggc_user
-
作为卷挂载在 Docker 容器中的 Docker 容器组件访问的文件。
-
如果您将 AWS IoT Greengrass Core 软件配置为使用网络代理,则必须将 Docker 配置为使用相同的代理服务器。
除这些要求外,您还必须满足以下要求(如果其适用于您的环境):
-
要使用 Docker Compose 创建和启动 Docker 容器,请在 Greengrass 核心设备上安装 Docker Compose,然后将您的 Docker Compose 文件上传到 S3 桶。您必须将 Compose 文件存储在 AWS 账户 与 AWS 区域 组件相同的 S3 存储桶中。有关在自定义组件中使用 docker-compose up 命令的示例,请参阅通过 Amazon ECR 或 Docker Hub 中的公共映像运行 Docker 容器。
-
如果您在网络代理 AWS IoT Greengrass 后面运行,请将 Docker 守护程序配置为使用代理服务器。
-
如果您的 Docker 映像存储在 Amazon ECR 或 Docker Hub 中,请将 Docker 组件管理器组件作为依赖关系包含在 Docker 容器组件中。在部署组件之前,必须在核心设备上启动 Docker 进程守护程序。
此外,还要将图像 URIs 作为组件工件包括在内。图片 URIs 必须采用以下示例所示的格式docker:registry/image[:tag|@digest]:
-
Amazon 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:GetAuthorizationToken、ecr:BatchGetImage 和 ecr:GetDownloadUrlForLayer 操作,如以下示例 IAM 策略中所示。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
有关通过存储在 Amazon ECR 私有存储库中的映像运行 Docker 容器的信息,请参阅通过 Amazon ECR 中的私有映像运行 Docker 容器。
-
要使用存储在 Amazon ECR 私有存储库中的 Docker 映像,私有存储库必须与核心设备位于同一 AWS 区域 位置。
-
如果您的 Docker 映像或 Compose 文件存储在 S3 桶中,则 Greengrass 设备角色必须允许 s3:GetObject 权限,以便让核心设备将映像下载为组件构件,如以下示例 IAM 策略所示。
- JSON
-
-
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
有关通过存储在 Amazon S3 中的映像运行 Docker 容器的信息,请参阅通过 Amazon S3 中的映像运行 Docker 容器。
-
要在 Docker 容器组件中使用进程间通信(IPC)、 AWS
凭证或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:
通过 Amazon ECR 或 Docker Hub 中的公共映像运行 Docker 容器
本节介绍如何创建自定义组件,使其使用 Docker Compose 通过存储在 Amazon ECR 和 Docker Hub 的 Docker 映像中运行 Docker 容器。
使用 Docker Compose 运行 Docker 容器
-
创建 Docker Compose 文件并将其上传到 Amazon S3 桶。确保 Greengrass 设备角色允许 s3:GetObject 权限,使设备能够访问 Compose 文件。以下示例中显示的示例撰写文件包括来自亚马逊 ECR 的亚马逊 CloudWatch 代理镜像和来自 Docker Hub 的 MySQL 镜像。
version: "3"
services:
cloudwatchagent:
image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"
mysql:
image: "mysql:8.0"
-
在 AWS IoT Greengrass 核心设备上创建自定义组件。以下示例中的配方具有以下属性:
-
作为依赖关系的 Docker 应用程序管理器组件。此组件允许 AWS 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://amzn-s3-demo-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://amzn-s3-demo-bucket/folder/docker-compose.yaml"
要在 Docker 容器组件中使用进程间通信(IPC)、 AWS
凭证或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:
-
测试组件,以验证其是否按预期运行。
在部署组件之前,必须安装并启动 Docker 进程守护程序。
在本地部署组件后,您可以运行 docker container ls 命令来验证您的容器是否运行。
docker container ls
-
组件准备就绪后,将该组件上传 AWS IoT Greengrass 到以部署到其他核心设备。有关更多信息,请参阅 发布组件以部署到您的核心设备。
通过 Amazon ECR 中的私有映像运行 Docker 容器
本节介绍如何创建自定义组件,使其通过存储在 Amazon ECR 私有存储库中的 Docker 映像运行 Docker 容器。
运行 Docker 容器
-
在 AWS IoT Greengrass 核心设备上创建自定义组件。使用以下配方示例,它具有以下属性:
-
作为依赖关系的 Docker 应用程序管理器组件。此组件允许 AWS IoT Greengrass 管理从私有存储库下载映像的凭证。
-
作为依赖关系的令牌交换服务组件。此组件允许检索 AWS 凭证 AWS 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)、 AWS
凭证或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:
-
测试组件,以验证其是否按预期运行。
在部署组件之前,必须安装并启动 Docker 进程守护程序。
在本地部署组件后,您可以运行 docker container ls 命令来验证您的容器是否运行。
docker container ls
-
将组件上传到 AWS IoT Greengrass 以部署到其他核心设备。有关更多信息,请参阅 发布组件以部署到您的核心设备。
通过 Amazon S3 中的映像运行 Docker 容器
本节介绍如何通过存储在 Amazon S3 中的 Docker 映像在组件中运行 Docker 容器。
通过 Amazon S3 中的映像在组件中运行 Docker 容器
-
运行 docker save 命令以创建 Docker 容器的备份。您需要将此备份作为组件构件提供,以便在 AWS IoT Greengrass上运行容器。hello-world替换为图像的名称,然后hello-world.tar替换为要创建的存档文件的名称。
docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
-
在 AWS 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"
}
}
}
]
}
- 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)、 AWS
凭证或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:
-
测试组件,以验证其是否按预期运行。
在本地部署组件后,您可以运行 docker container ls 命令来验证您的容器是否运行。
docker container ls
-
组件准备就绪后,将 Docker 映像存档上传到 S3 桶,然后将其 URI 添加到组件配方中。然后,您可以将组件上传到 AWS 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://amzn-s3-demo-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://amzn-s3-demo-bucket/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
在 Docker 容器组件中使用进程间通信
您可以使用中的 Greengrass 进程间通信 (IPC) 库与 Greengrass 核、 AWS IoT Device SDK 其他 Greengrass 组件以及进行通信。 AWS IoT Core有关更多信息,请参阅 使用 AWS IoT Device SDK 与 Greengrass 原子核、其他组件进行通信 AWS IoT Core。
要在 Docker 容器组件中使用 IPC,必须使用以下参数运行 Docker 容器:
-
将 IPC 套接字挂载在容器中。Greengrass Nucleus在 AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT 环境变量中提供 IPC 套接字文件路径。
-
将 SVCUID 和 AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT 环境变量设置为 Greengrass Nucleus为组件提供的值。您的组件使用这些环境变量来验证与 Greengrass Nucleus的连接。
例 示例配方:将 MQTT 消息发布到 AWS IoT Core (Python)
以下配方定义了一个将 MQTT 消息发布到的 Docker 容器组件示例。 AWS IoT Core该配方具有以下属性:
- 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://amzn-s3-demo-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://amzn-s3-demo-bucket/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar
在 Docker 容器组件中使用 AWS 凭证 (Linux)
您可以使用令牌交换服务组件与 Greengrass 组件中的 AWS 服务进行交互。此组件使用本地容器服务器提供来自核心设备的令牌交换角色的 AWS 凭证。有关更多信息,请参阅 与 AWS 服务互动。
要在 Docker 容器组件中使用来自令牌交换服务的 AWS 凭证,必须使用以下参数运行 Docker 容器:
-
使用 --network=host 参数提供对主机网络的访问权限。此选项使 Docker 容器能够连接到本地令牌交换服务以检索 AWS 凭据。此参数仅适用于 Linux 版 Docker。
此选项允许容器访问主机上的所有本地网络接口,因此与不能访问主机网络的 Docker 容器相比,该选项的安全性较低。在开发和运行使用此选项的 Docker 容器组件时,请考虑这一点。有关更多信息,请参阅 Docker 文档中的网络:主机。
-
将AWS_CONTAINER_CREDENTIALS_FULL_URI和AWS_CONTAINER_AUTHORIZATION_TOKEN环境变量设置为 Greengrass 核为组件提供的值。 AWS SDKs 使用这些环境变量来检索 AWS 凭证。
例 示例配方:在 Docker 容器组件中列出 S3 桶(Python)
以下配方定义了一个可以列出您 AWS 账户中 S3 桶的示例 Docker 容器组件。该配方具有以下属性:
-
作为依赖关系的令牌交换服务组件。这种依赖关系使组件能够检索 AWS 凭证以与其他 AWS 服务进行交互。
-
将 Docker 映像指定为 Amazon S3 中的 TAR 存档的组件构件。
-
从 TAR 存档中加载 Docker 映像的生命周期安装脚本。
-
通过映像运行 Docker 容器的生命周期运行脚本。Docker run 命令具有以下参数:
- 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://amzn-s3-demo-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://amzn-s3-demo-bucket/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar
在 Docker 容器组件中使用流管理器(Linux)
您可以使用流管理器组件来管理 Greengrass 组件中的数据流。此组件使您能够处理数据流并将大量物联网数据传输到. AWS Cloud AWS IoT Greengrass 提供了用于与流管理器组件交互的流管理器 SDK。有关更多信息,请参阅 管理 Greengrass 核心设备上的数据流。
要在 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)
以下配方定义了一个用于创建文件并将其流式传输到 S3 桶的示例 Docker 容器组件。该配方具有以下属性:
-
作为依赖关系的流管理器组件。此依赖关系使组件能够使用流管理器 SDK 与流管理器组件进行交互。
-
将 Docker 映像指定为 Amazon S3 中的 TAR 存档的组件构件。
-
从 TAR 存档中加载 Docker 映像的生命周期安装脚本。
-
通过映像运行 Docker 容器的生命周期运行脚本。Docker run 命令具有以下参数:
-
--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://amzn-s3-demo-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://amzn-s3-demo-bucket/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar