You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,彻底避开跨系统执行的问题:

    1. 进入容器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
      
    2. 之后代码里直接调用不带.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
      }
      
  • 通过WSL挂载调用(不推荐)
    如果坚持用Linux容器调用主机上的Windows版yt-dlp,可通过WSL的interop功能实现,但稳定性差,仅适合测试:

    1. 启动容器时挂载主机yt-dlp所在目录:docker run -v /host/path/to/yt-dlp:/app/yt-dlp ...
    2. 在容器内通过WSL映射路径调用,比如/mnt/c/Users/xxx/yt-dlp/yt-dlp.exe,但可能遇到权限、环境依赖等问题,不建议生产环境使用。

代码优化建议

建议用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:23:19