如何通过Docker Engine RESTful API启动容器交互式Shell?
解决Docker Exec API交互问题
你当前的问题出在curl没有开启终端交互模式,无法和Docker返回的raw-stream进行双向通信。要实现docker exec -it的等效效果,需要给第二个curl命令添加两个关键参数:
-t:强制分配伪终端(对应docker exec的-t)-i:保持stdin打开(对应docker exec的-i)
修改后的启动exec实例的curl命令如下:
curl -it --unix-socket /run/docker.sock \ http/exec/853938b2621606f85c04409ec7e345b884d46b95985a4fca0e8ddf28e20e1f79/start \ -H "Content-Type: application/json" \ -d '{ "Detach":false, "Tty":true }'
为什么原来的命令不行?
当你设置Tty: true并请求非分离模式时,Docker会返回一个原始的字节流(application/vnd.docker.raw-stream),这个流需要直接绑定到你的终端才能支持交互。默认情况下curl不会把stdin/stdout/stderr和终端关联,加上-it参数后,curl会模拟终端环境,让你能和容器内的bash会话进行交互。
额外注意事项
- 你使用的curl 7.85.0版本已经支持unix socket的终端交互特性,无需担心版本兼容问题。
- 执行修改后的命令后,会直接进入容器的bash会话,退出时可使用
exit命令或Ctrl+D。
内容的提问来源于stack exchange,提问作者Ancool
相关产品推荐
相关产品推荐

