Docker在构建镜像时无法删除文件

3
我的DockerFile包含以下指令:
rm -f plugins.7z

这个命令在早期版本的docker中按预期工作,但在1.13版本中失败了。我看到以下错误:

cannot access plugins.7z: No such file or directory

如果我使用基础镜像启动容器并手动执行命令,会出现同样的错误。
尝试列出文件夹内容会显示:
# ls -lrt
  ls: cannot access plugins.7z: No such file or directory
  total 12
  ???????????   ? ?          ?             ?            ? plugins.7z

这在Docker Issues中没有列为已知问题。我该如何进一步调试这个问题?
编辑:
  1. 由于IP的原因,我无法在此处发布完整的Dockerfile。 另外,可能并不需要。正如我所提到的,即使手动运行容器并尝试执行命令,我也能模拟出这个问题。
  2. 在我尝试删除它之前,该文件是存在的。
  3. 我对问题列表中没有类似的错误表示错误。这里有一个链接
  4. 问题可能与该文件无关。删除该文件夹中的其他文件/文件夹也会使其以???权限显示。
  5. 执行操作的用户是root。

2
你能发布完整的Dockerfile吗? - Akki
1
插件文件在哪里?在哪个目录中?也许你试图从错误的路径删除它? - Uri Shalit
我在 Docker 1.12.6 中遇到了这个问题 -- 问题出在文件系统支持 d_type,如下面的回答+评论中完全解释。 - Friendly Genius
2个回答

3
删除目录失败的原因是后端(xfs)文件系统没有使用 d_type 支持格式化(“ftype=1”)。您可以在github上找到有关此问题的讨论;https://github.com/docker/docker/issues/27358
要验证系统是否支持 d_type,请检查 dockerinfo 的输出;
Server Version: 1.13.1
Storage Driver: overlay
 Backing Filesystem: xfs
 Supports d_type: false
Logging Driver: json-file

这个要求也在RHEL/CentOS的发布说明中描述。

请注意,必须使用-n ftype=1选项创建XFS文件系统以用作叠加层。对于rootfs和在系统安装期间创建的任何文件系统,请在Anaconda Kickstart中设置--mkfsoptions=-n ftype=1参数。在安装后创建新文件系统时,请运行# mkfs -t xfs -n ftype=1 /PATH/TO/DEVICE命令。要确定现有文件系统是否适合用作叠加层,请运行# xfs_info /PATH/TO/DEVICE | grep ftype命令,查看是否启用了ftype = 1选项。

要解决该问题,可以执行以下操作之一:

  • 使用ftype=1重新格式化设备。
  • 使用不同的存储驱动程序。请注意,默认的设备映射器配置(使用回环设备)不建议在生产环境中使用,因此需要手动配置。

为了向后兼容(旧版本的docker允许在没有d_type的系统上运行覆盖层),docker 1.13仅会在守护进程日志中记录一个警告https://github.com/docker/docker/pull/27433),但在将来的版本中将不再受支持。


0

已经成功解决了这个问题。

1.13版本的变更日志中提到:

"IMPORTANT: On Linux distributions where devicemapper was the default
storage driver, the overlay2, or overlay is now used by default 
(if the kernel supports it)."

所以我尝试重新安装devicemapper,现在它正在按预期工作。


你能分享一些更详细的信息吗? - Vatsal Prakash
@VatsalPrakash 我尝试的只是一个权宜之计。请查看被接受的答案。正确的解决方案是在不同文件系统的磁盘上安装Docker。 - Vivek Kodira
哦,谢谢。 :) - Vatsal Prakash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接