如何在设置了WORKDIR /app的Node.js容器中通过volumes_from访问共享存储卷
我来帮你理清这个问题的核心——你误解了volumes_from的工作方式,它不是把卷直接映射到某个以卷名命名的路径,而是完全复用目标容器里的挂载配置。
问题根源
你的client-test容器把aca_storage卷挂载到了/app/files_to_share路径:
client-test: volumes: - aca_storage:/app/files_to_share
当你在server-test里用volumes_from: client-test:ro时,Docker会把client容器里的所有挂载点(包括这个卷的挂载路径)原封不动地复制到server容器里。也就是说,aca_storage卷在server-test里的挂载路径也是**/app/files_to_share**,而不是你尝试的/aca_storage或其他卷名相关的路径。
验证与解决步骤
先验证挂载路径
进入aca-server-test容器后,直接执行:ls /app/files_to_share你应该能看到client容器写入的文件了。如果还看不到,先确认client容器确实已经向这个路径写入了文件,或者client容器是否正常运行过。
修改Node.js代码的路径
把PATH_TO_SHARED_VOLUME改成/app/files_to_share,或者因为你的Node.js应用的WORKDIR是/app,用相对路径./files_to_share也可以:const PATH_TO_SHARED_VOLUME = '/app/files_to_share'; // 或者 './files_to_share' fs.readdir(PATH_TO_SHARED_VOLUME, function (err, files) { if (err) { return console.log('Unable to scan directory: ' + err); } files.forEach(function (file) { console.log(file); }); });更稳妥的替代方案(推荐)
其实volumes_from的耦合性比较高,它依赖client容器的挂载配置。你可以直接在server-test的配置里挂载同一个卷,自己指定挂载路径,这样更清晰可控:server-test: image: aca-server:0.0.1 container_name: aca-server-test command: sh -c "npm install && npm run start:dev" ports: - 8080:8080 volumes: - aca_storage:/app/files_to_share # 直接挂载卷到指定路径 environment: NODE_ENV: development这样即使client容器的挂载路径变化,server容器的路径也不受影响,维护起来更方便。
排查挂载信息的通用方法
如果你不确定卷的挂载路径,可以用Docker命令查看容器的详细挂载信息:docker inspect aca-server-test | grep -A 10 "Mounts"输出里会显示每个卷的
Source(宿主机或卷名)和Destination(容器内的挂载路径),你直接用Destination的值作为文件路径就可以了。
额外注意事项
- 确保
client-test容器已经成功向/app/files_to_share写入了文件,比如进入client容器执行ls /app/files_to_share确认文件存在。 - 因为你用了
:ro只读模式挂载,server容器只能读取文件,不能修改,这符合你的需求,但如果后续需要写入,记得去掉:ro。
内容的提问来源于stack exchange,提问作者Qua285

