Docker Swarm中使用命名卷挂载Digital Ocean存储的问题咨询
问题定位与修复方案
我一眼就看到了你的docker-stack.yml里命名卷配置的问题——这也是bind挂载常见的小疏漏,直接导致双向同步失效。
核心错误点
在blockchain卷的driver_opts里,device字段多了一个前置的冒号:
# 错误写法 device: :/mnt/blockchain-data
当使用local驱动的bind类型挂载时,device直接填写主机的绝对路径即可,不需要额外的冒号(冒号是用于远程挂载或其他特殊挂载场景的语法)。
修正后的完整卷配置
把blockchain卷的配置改成这样,同时推荐显式添加绑定选项确保双向同步:
volumes: blockchain: driver: local driver_opts: type: bind device: /mnt/blockchain-data o: bind # 明确指定双向绑定模式,避免歧义
额外关键注意事项
- 目录权限检查:确保manager节点上的
/mnt/blockchain-data目录权限适配容器内的bcoin运行用户。可以先临时启动容器查看用户UID:
再调整主机目录权限(假设容器内用户UID为1000):docker run --rm hollarves/bcoin-mueve idsudo chown -R 1000:1000 /mnt/blockchain-data - 验证双向同步:修复后重新部署栈,然后做简单测试:
去主机# 重新部署 docker stack deploy -c docker-stack.yml bcoin-stack # 进入容器创建测试文件 docker exec -it $(docker ps -q -f name=bcoin) touch /data/test-from-container.txt/mnt/blockchain-data目录查看是否同步生成了文件;反之在主机目录创建文件,检查容器内/data目录是否同步,确认双向读写生效。 - 配置文件路径校验:你的配置里用
${PWD}/bitcoin/secrets/挂载了bcoin的配置文件,要确保部署栈时,当前工作目录下的这个路径在manager节点上确实存在,否则会导致容器启动失败。
这样修改后,容器的/data目录就会和主机的/mnt/blockchain-data实现完全双向同步,既能保存区块链数据避免重建容器时重新下载,也能支持批量复制节点直接复用已有数据。
内容的提问来源于stack exchange,提问作者Henry Ollarves




