Azure Container Instance服务介绍
Azure 容器实例(Azure Container Instances,简称 ACI)是一个无服务器容器解决方案,允许用户在 Azure 云环境中运行 Docker 容器,而无需设置虚拟机、集群或编排器。
ACI 适用于任何可以在隔离容器中操作的场景,包括事件驱动的应用程序、从容器开发管道快速部署、数据处理和生成作业。
Execute 命令的目的是在运行中的容器实例中执行命令。
这在应用程序开发和故障排除期间特别有用,最常见的用途是启动交互式 shell,以便在运行中的容器中调试问题
问题描述
使用命令行 az container exec 之后,会进入这个容器里,并且有一个窗口进行交互。
命令如下:
az container exec --resource-group <container_instance_rg> --name <testcontainer-instance> --container-name <testcontainer-instance> --exec-command "/bin/bash"
结果如下:
但是,如果调用Python SDK 以及REST API去调用 Execute 执行命令,返回的内容确实一个 webSocketUri 加 password 的JSON对象。
难道这个同一个命令,两种执行方式的差异吗?为什么表现得结果如此不同呢?
问题解答
经过调查和研究 Containers - Execute Command - REST API (Azure Container Instances) | Microsoft Learn 这个文档, az container exec 和 Python SDK一样,都是调用得REST API 执行指令. 只是执行az命令得 CMD 窗口自动解析了命令返回得 webSockerUri 和 Password。所以显示出一个交互式页面。
但是,如果使用REST API或者Python SDK,需要把请求返回得Web Socket JSON对象,通过websocket 方式与目标Container进行通信, 在浏览器的Console中执行如下JavaScript脚本:
wsUri = '<webSocketUri>'; wsPass = '<password>'; var aWebSocket = new WebSocket(wsUri); aWebSocket.send(wsPass);
执行后的结果中,就看可以看见 root@xxxx : 内容。与 命令窗口结果一样!
所以,最终结论为:Python SDK 和 az container exec 结果完全一样,只是执行方式不一样,Python SDK返回的结果需要使用websocket的方式进行交互!
参考资料
Containers - Execute Command : https://learn.microsoft.com/en-us/rest/api/container-instances/containers/execute-command?view=rest-container-instances-2023-05-01&tabs=Python#containerexec
Web Socket Authentication :https://websockets.readthedocs.io/en/stable/topics/authentication.html