以下是对Azure Container Instance服务的执行命令过程中不同方式的分析和描述。
在Azure云环境中,Azure容器实例(Azure Container Instances,ACI)是一种无服务器容器解决方案,允许用户无需设置虚拟机、集群或编排器,就可以在Azure云环境中运行Docker容器。
ACI适用于多种场景,包括事件驱动的应用程序、快速部署从容器开发管道到数据处理和生成作业。
对于运行中的容器实例,”Execute”命令的目的是在容器内执行命令。这种方式在应用程序开发和故障排除期间特别有用,最常见的用途是启动交互式shell以便在容器实例中调试问题。
执行命令”az container exec”后,可以进入容器并与之进行交互。具体命令如下:
然而,如果使用Python SDK和REST API去调用”Execute”执行命令,返回的内容将是一个包含”webSocketUri”和”password”的JSON对象。具体表现如下:
为什么同一个命令以两种不同的方式执行后会表现出如此不同的结果?是否有差异?为何会出现这样的结果呢?
经过调查和研究,发现”az container exec”和Python SDK调用都是使用REST API 执行指令。只不过”az container exec”命令的CMD窗口自动解析了命令返回的webSockerUri和Password,并显示为一个交互式页面。
但是,如果使用REST API或Python SDK,需要通过websocket方式与目标容器进行通信,因此需要将请求返回的Web Socket JSON对象,通过web socket的方式进行交互。下面是在浏览器的Console中执行的JavaScript脚本:
以上结果也可以通过websocket方式进行交互,具体执行结果可见”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