如果用 数据卷名:镜像中已有目录 的方式使用第三方数据卷(如o1:/data,而镜像中有/data目录),启动容器会失败,系统会返回类似于 chown /mnt/acs_mnt/ossfs/XXXX: input/output error 的错误。
产生这个错误的原因是,对于命名数据卷,Docker 会把镜像中已有的文件复制到数据卷中,并用 chown 设置相应的用户权限,而 Linux 禁止对挂载点使用 chown。
您可以通过以下两种方法之一解决该问题:
升级 Docker 到 1.11 或以上版本,升级 Agent 到最新版本并在编排模板中指定 nocopy 选项。Docker 会跳过复制数据的过程,因此不会产生 chown 错误。
-
[backcolor=transparent]
volumes[backcolor=transparent]
:
- [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] o1[backcolor=transparent]:/[backcolor=transparent]data[backcolor=transparent]:[backcolor=transparent]nocopy
- [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]/tmp:/[backcolor=transparent]bbb
如果必须复制数据,您可以不使用数据卷名称,而使用挂载点路径进行设置,比如用/mnt/acs_mnt/ossfs/XXXX:/data。但这种方式绕开了 volume driver,在机器重启时,无法保证在 OSSFS 挂载成功之后再启动容器,可能会导致容器挂载了一个本地数据卷。为了避免这种情况,您需要同时使用两个数据卷,其中一个数据卷使用数据卷名称进行设置,另外一个数据卷使用挂载点路径进行设置。使用数据卷名称进行设置的数据卷只起到和 volume driver 同步的功能,并不用于存储。
-
[backcolor=transparent]
volumes[backcolor=transparent]
:
- [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] o1[backcolor=transparent]:/[backcolor=transparent]nouse
- [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]/mnt/[backcolor=transparent]acs_mnt[backcolor=transparent]/[backcolor=transparent]ossfs[backcolor=transparent]/[backcolor=transparent]XXXX[backcolor=transparent]:/[backcolor=transparent]data
- [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]/tmp:/[backcolor=transparent]bbb