Windows11+Docker环境下Rails调用exe报Vsock socket错误求助
解决Docker容器中调用yt-dlp.exe的报错问题
核心问题
你当前使用的Docker镜像应该是Linux版本的,Linux容器无法直接运行Windows格式的.exe程序——Linux系统不识别Windows的PE可执行文件格式,强行执行就会触发UtilBindVsockAnyPort:284: socket failed 1这类底层错误;去掉.exe后缀找不到文件,也是因为Linux系统不会默认识别无后缀的Windows可执行文件。
可行解决方案
改用Windows Docker镜像
切换到基于Windows的Docker镜像(比如mcr.microsoft.com/windows/servercore),同时在Docker Desktop右下角右键切换到「Windows容器」模式。容器内变成Windows环境后,就能正常运行yt-dlp.exe,代码无需大改。
注意:Windows镜像体积通常比Linux镜像大很多,按需选择。替换为Linux版yt-dlp
在Linux容器内安装原生Linux版本的yt-dlp,彻底避开跨系统执行的问题:- 进入容器shell,执行安装命令:
curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp chmod a+rx /usr/local/bin/yt-dlp - 之后代码里直接调用不带
.exe的命令即可:Dir.chdir('yt-dlp'){ @command = Thread.new do @echoed = %x[ls] %x[yt-dlp [youtube-url] --extract-audio --audio-format mp3] end @command.join }
- 进入容器shell,执行安装命令:
通过WSL挂载调用(不推荐)
如果坚持用Linux容器调用主机上的Windows版yt-dlp,可通过WSL的interop功能实现,但稳定性差,仅适合测试:- 启动容器时挂载主机yt-dlp所在目录:
docker run -v /host/path/to/yt-dlp:/app/yt-dlp ... - 在容器内通过WSL映射路径调用,比如
/mnt/c/Users/xxx/yt-dlp/yt-dlp.exe,但可能遇到权限、环境依赖等问题,不建议生产环境使用。
- 启动容器时挂载主机yt-dlp所在目录:
代码优化建议
建议用Ruby的Open3库替代%x[],方便捕获执行时的输出和错误信息,排查问题更高效:
require 'open3' Dir.chdir('yt-dlp') do stdout, stderr, status = Open3.capture3("yt-dlp [youtube-url] --extract-audio --audio-format mp3") puts "执行输出: #{stdout}" puts "错误信息: #{stderr}" puts "退出状态: #{status.exitstatus}" end
内容的提问来源于stack exchange,提问作者zexar221
相关产品推荐
相关产品推荐

