跳至内容

在Python Docker容器中使用StreamManager进行身份验证。

0

【以下的问题经过翻译处理】 在Greengrass V2的开发指南中,它说要使用进程间通信,一个Docker容器必须设置以下环境变量。

AWS_REGION

SVCUID

AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT

AWS_CONTAINER_AUTHORIZATION_TOKEN

AWS_CONTAINER_CREDENTIALS_FULL_URI

https://docs.aws.amazon.com/greengrass/v2/developerguide/run-docker-container.html

我编写了一个简单的Docker容器,只需安装流式管理器SDK,并尝试创建一个StreamManagerClient实例。Dockerfile如下所示:

FROM python:3.9-alpine
ENV PYTHONUNBUFFERED=1
WORKDIR /workdir
RUN apk add git && pip install git+https://github.com/aws-greengrass/aws-greengrass-stream-manager-sdk-python
COPY test_connect.py test_connect.py
CMD [ "python", "test_connect.py" ]

python脚本test_connect.py如下所示:

from stream_manager import StreamManagerClient

def main():
    client = StreamManagerClient()
    print(f"Connected to client: {client}")

if __name__ == "__main__":
    main()

我组件配方中的“Run”生命周期步骤如下所示:

docker run -v /greengrass/v2:/greengrass/v2 -e AWS_REGION=$AWS_REGION -e SVCUID=$SVCUID -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT=$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e AWS_CONTAINER_AUTHORIZATION_TOKEN=$AWS_CONTAINER_AUTHORIZATION_TOKEN -e AWS_CONTAINER_CREDENTIALS_FULL_URI=$AWS_CONTAINER_CREDENTIALS_FULL_URI --rm stream-test-docker

当这个组件运行时,python脚本会因以下错误而失败:

Connection error while connecting to server: [Errno 111] Connect call failed ('127.0.0.1', 8088)
Traceback (most recent call last):
  File "/workdir/test_connect.py", line 10, in <module>
    main()
  File "/workdir/test
专家
已提问 2 年前31 查看次数
1 回答
0

【以下的回答经过翻译处理】 你好,

Stream Manager绑定到了本地主机,这可能是容器内的客户端无法连接到SM服务器的原因。建议您尝试通过容器使用的网络网关进行连接。如果使用默认网络,则最可能的网络名称为“bridge”。

您可以通过运行“docker network ls”来列出可用网络,例如我的可用网络:

NETWORK ID          NAME                DRIVER              SCOPE  
9d81c010d50a        bridge              bridge              local  
d1fdeb535122        host                host                local  
72f2a273972a        none                null                local  

现在您应该找到容器运行的网络。

要做到这一点,请运行“docker inspect --format ='{{json.NetorkSettings.Networks}}' <NAME_OF_THE_CONTAINER>”,例如我的是“bridge”:

{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"9d81c010d50a3e2b2d175e68bcdac6edb6c440677af479dc4256f612f6d4146c","EndpointID":"702afd9f1cab8d837baf9e0917a3a28fc7131e2b92acc8124500e2d05a178f58","Gateway":"240.10.0.1","IPAddress":"240.10.0.2","IPPrefixLen":24,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:f0:0a:00:02","DriverOpts":null}}  

即我的容器正在使用“bridge”网络,这也是默认设置。桥接网络的网关默认应为“172.17.0.1”,我们可以使用“docker network inspect bridge”确认此点。

一旦您获得了网关地址,您需要将Stream Manager客户端配置为通过网关通信。

修改示例代码如下:

from stream_manager import StreamManagerClient  
   
def main():  
    client = StreamManagerClient(host='172.17.0.1')  
    print(f"Connected to client: {client}")  
   
if __name
专家
已回答 2 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。