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

Docker绑定挂载目录下Ruby flock方法无法正确锁定文件

MacOS下Docker绑定挂载目录中Ruby flock文件锁失效问题

在MacOS环境中,当锁定目标文件处于Docker绑定挂载的目录时,Ruby的flock方法无法正确实现排他锁:

  • 复现场景下,同一个文件被重新打开后,第二次调用flock(File::LOCK_EX | File::LOCK_NB)返回0(表示成功获取锁),但预期应返回false(无法获取锁)
  • 当文件位于容器内创建的目录(非绑定挂载目录),或直接在Mac本地运行脚本时,flock功能正常,第二次调用会返回false

复现步骤

  • 在本地创建tmp_test目录
  • 通过Docker将本地的lock.rb脚本和tmp_test目录绑定挂载到容器内
  • 进入容器终端运行测试脚本

测试脚本

require 'pathname'
class FlockTest
  def initialize
    @file_path = Pathname(File.join(Dir.pwd, 'tmp_test/file.lock'))
    puts "first opened file"
    @file = file_path.open(File::WRONLY | File::CREAT)
  end

  attr_reader :file_path, :file

  def test
    flock
    reopen_file
    flock
    reopen_file
    flock
  ensure
    file.close
    File.delete(file_path)
  end

  def reopen_file
    @file = file_path.open(File::WRONLY | File::CREAT)
    puts "reopened file"
  end

  def flock
    puts "flock: #{file.flock(File::LOCK_EX | File::LOCK_NB)}"
  end
end

FlockTest.new.test

执行命令

绑定挂载场景(锁失效)

mkdir tmp_test
docker run -it --rm --mount type=bind,source="$(pwd)/lock.rb",target="/lock.rb" --mount type=bind,source="$(pwd)/tmp_test",target="/tmp_test" ruby:3.0.7 bash
ruby lock.rb

非挂载场景(锁正常)

docker run -it --rm --mount type=bind,source="$(pwd)/lock.rb",target="/lock.rb" ruby:3.0.7 bash
mkdir tmp_test
ruby lock.rb

内容的提问来源于stack exchange,提问作者mario199

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:36:17