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
相关产品推荐
相关产品推荐

