Docker-compose启动容器偶发无法创建挂载路径/foo/logs报错咨询
报错根因
这个偶发报错的核心原因是多个容器并行启动时,Docker并发创建绑定挂载的源路径/foo/logs出现资源竞争,导致目录创建逻辑异常触发只读挂载标记,部分旧版Docker引擎的挂载处理bug也会放大该问题。
稳定修复方案
预先创建宿主机目录,避免Docker自动生成路径
执行docker-compose启动命令前先手动创建目录并固定权限,彻底消除并发创建目录的冲突,命令如下:mkdir -p /foo/logs && chmod 755 /foo/logs可以将该命令写入服务发布脚本的前置执行步骤,无需人工手动操作。
调整docker-compose配置使用命名卷管理共享目录
不要为每个服务单独配置宿主机绑定挂载,改用顶层声明的Docker命名卷统一管理共享日志目录,Docker仅会在初始化命名卷时校验一次宿主机路径,不会出现并发创建冲突,配置示例如下:# 顶层声明共享日志卷 volumes: shared_logs: driver: local driver_opts: type: none o: bind device: /foo/logs services: foo-service: # 其余原有配置保留 volumes: - shared_logs:/app/foo-service/logs foo-service1: volumes: - shared_logs:/app/foo-service1/logs # 其余所有服务的日志挂载均按以上格式调整即可配置容器启动自动重试策略
为所有服务添加重启策略,偶发冲突导致的启动失败会自动重试,无需人工干预,配置示例:services: foo-service: # 其余原有配置保留 restart: on-failure:3升级Docker引擎到稳定版
该并发挂载冲突导致只读报错的问题是Docker 20.10.18之前版本的已知bug,升级到20.10.18及以上的稳定版Docker引擎,即可从底层修复该问题。排查宿主机分区异常
执行mount | grep /foo确认/foo目录所在分区的挂载属性为rw(可读可写),排除磁盘故障、systemd挂载保护等系统层面的只读规则导致的报错。
内容的提问来源于stack exchange,提问作者Rpj
相关产品推荐
相关产品推荐

