Windows10下Docker Python包4.3.1与Docker Desktop4.12.0兼容故障求助
解决Docker Desktop 4.12.0下
container.exec_run()报错问题 问题描述
升级Docker Desktop到4.12.0版本后,调用container.exec_run()方法时触发pywintypes.error: (109, 'ReadFile', '管道已终止。')错误,完整堆栈信息如下:
out = self.container.exec_run(command, user=user, demux=demux, environment=environment, workdir=workdir) 文件 "C:\test-proj\build_en\lib\site-packages\docker\models\containers.py",第198行,在exec_run中 exec_output = self.client.api.exec_start( 文件 "C:\test-proj\build_en\lib\site-packages\docker\utils\decorators.py",第19行,在wrapped中 return f(self, resource_id, *args, **kwargs) 文件 "C:\test-proj\build_en\lib\site-packages\docker\api\exec_api.py",第169行,在exec_start中 return self._read_from_socket(res, stream, tty=tty, demux=demux) 文件 "C:\test-proj\build_en\lib\site-packages\docker\api\client.py",第413行,在_read_from_socket中 return consume_socket_output(gen, demux=demux) 文件 "C:\test-proj\build_en\lib\site-packages\docker\utils\socket.py",第137行,在consume_socket_output中 return six.binary_type().join(frames) 文件 "C:\test-proj\build_en\lib\site-packages\docker\api\client.py",第407行 gen = (data for (_, data) in gen) 文件 "C:\test-proj\build_en\lib\site-packages\docker\utils\socket.py",第94行,在frames_iter_no_tty中 (stream, n) = next_frame_header(socket) 文件 "C:\test-proj\build_en\lib\site-packages\docker\utils\socket.py",第66行,在next_frame_header中 data = read_exactly(socket, 8) 文件 "C:\test-proj\build_en\lib\site-packages\docker\utils\socket.py",第51行,在read_exactly中 next_data = read(socket, n - len(data)) 文件 "C:\test-proj\build_en\lib\site-packages\docker\utils\socket.py",第35行,在read中 return socket.recv(n) 文件 "C:\test-proj\build_en\lib\site-packages\docker\transport\npipesocket.py",第23行,在wrapped中 return f(self, *args, **kwargs) 文件 "C:\test-proj\build_en\lib\site-packages\docker\transport\npipesocket.py",第117行,在recv中 err, data = win32file.ReadFile(self._handle, bufsize) pywintypes.error: (109, 'ReadFile', '管道已终止。')
可行解决方法
- 降级Docker Desktop版本:回退到4.11.x或更早的稳定版本,该版本的管道通信逻辑未出现此兼容性问题。
- 更新docker-py库:将
dockerPython库升级到最新版本(至少2.0.0以上),新版本修复了与Docker Desktop 4.12.0的NPipe通信适配问题。执行命令:pip install --upgrade docker - 调整exec_run调用参数:尝试移除
demux=True参数,改用默认的合并输出模式;或者显式指定stream=False,避免流式读取时的管道中断问题。 - 重启Docker Desktop:完全关闭Docker Desktop后重新启动,清理残留的管道连接,可能解决临时的通信异常。
内容的提问来源于stack exchange,提问作者merlachandra
相关产品推荐
相关产品推荐

