在构build镜像时,Docker无法删除目录

这个问题类似于Docker在构build映像时无法删除文件

但是,路由的原因是不一样的,因为在我的情况下启用d_type

这是Dockerfile

 FROM arm64v8/ubuntu:latest RUN export DEBIAN_FRONTEND='noninteractive' && \ rm -rf /var/lib/apt/lists/* /tmp/* /usr/share/doc 

当试图build立图像

 docker build -t arm64v8-ubuntu-test . 

我得到以下错误

 Sending build context to Docker daemon 3.584kB Step 1/2 : FROM arm64v8/ubuntu:latest ---> 499b06aa549b Step 2/2 : RUN export DEBIAN_FRONTEND='noninteractive' && rm -rf /var/lib/apt/lists/* /tmp/* /usr/share/doc ---> Running in 5ff328ef5a57 rm: cannot remove '/usr/share/doc/sed': Directory not empty rm: cannot remove '/usr/share/doc/libpam-modules': Directory not empty rm: cannot remove '/usr/share/doc/util-linux': Directory not empty rm: cannot remove '/usr/share/doc/mawk': Directory not empty rm: cannot remove '/usr/share/doc/gnupg': Directory not empty rm: cannot remove '/usr/share/doc/apt': Directory not empty rm: cannot remove '/usr/share/doc/libreadline6': Directory not empty rm: cannot remove '/usr/share/doc/adduser/examples/adduser.local.conf.examples': Directory not empty rm: cannot remove '/usr/share/doc/passwd': Directory not empty rm: cannot remove '/usr/share/doc/mount': Directory not empty rm: cannot remove '/usr/share/doc/procps': Directory not empty The command '/bin/sh -c export DEBIAN_FRONTEND='noninteractive' && rm -rf /var/lib/apt/lists/* /tmp/* /usr/share/doc' returned a non-zero code: 1 

我的docker信息是

 $ docker info Containers: 7 Running: 1 Paused: 0 Stopped: 6 Images: 95 Server Version: 17.10.0-ce Storage Driver: overlay Backing Filesystem: extfs Supports d_type: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog Swarm: active NodeID: mjm8vu1ixmw1ls25dk7gomiva Is Manager: true ClusterID: lnspgxtrca8d4lm3kfv7zbz77 Managers: 3 Nodes: 3 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000 Number of Old Snapshots to Retain: 0 Heartbeat Tick: 1 Election Tick: 3 Dispatcher: Heartbeat Period: 5 seconds CA Configuration: Expiry Duration: 3 months Force Rotate: 0 Autolock Managers: false Root Rotation In Progress: false Node Address: 10.0.4.71 Manager Addresses: 10.0.4.71:2377 10.0.4.72:2377 10.0.4.73:2377 Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 06b9cb35161009dcb7123345749fef02f7cea8e0 runc version: 0351df1c5a66838d0c392b4ac4cf9450de844e2d init version: 949e6fa Security Options: seccomp Profile: default Kernel Version: 3.14.79-27-ARCH Operating System: Arch Linux ARM OSType: linux Architecture: aarch64 CPUs: 4 Total Memory: 1.928GiB Name: alarm-docker-manager-host ID: Y5ZZ:5G3O:KIE2:MSQX:7MBB:XWOZ:CYLL:2SSY:GTMB:YCBG:4TTT:EJVN Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false 

例如,手动运行容器并尝试执行该命令具有相同的结果

 $ docker run --rm -it arm64v8/ubuntu:latest bash root@87a3ea8fecdd:~# rm -rf /var/lib/apt/lists/* /tmp/* /usr/share/doc rm: cannot remove '/usr/share/doc/sed': Directory not empty rm: cannot remove '/usr/share/doc/libpam-modules': Directory not empty rm: cannot remove '/usr/share/doc/util-linux': Directory not empty rm: cannot remove '/usr/share/doc/mawk': Directory not empty rm: cannot remove '/usr/share/doc/gnupg': Directory not empty rm: cannot remove '/usr/share/doc/apt': Directory not empty rm: cannot remove '/usr/share/doc/libreadline6': Directory not empty rm: cannot remove '/usr/share/doc/adduser/examples/adduser.local.conf.examples': Directory not empty rm: cannot remove '/usr/share/doc/passwd': Directory not empty rm: cannot remove '/usr/share/doc/mount': Directory not empty rm: cannot remove '/usr/share/doc/procps': Directory not empty 

此外,权限似乎很好,目录是在那里,并没有被其他进程使用

 root@87a3ea8fecdd:/# ls -lah / total 68K drwxr-xr-x 1 root root 4.0K Oct 19 06:43 . drwxr-xr-x 1 root root 4.0K Oct 19 06:43 .. -rwxr-xr-x 1 root root 0 Oct 19 06:43 .dockerenv drwxr-xr-x 2 root root 4.0K Oct 19 05:39 bin drwxr-xr-x 2 root root 4.0K Apr 12 2016 boot drwxr-xr-x 5 root root 360 Oct 19 06:44 dev drwxr-xr-x 1 root root 4.0K Oct 19 06:43 etc drwxr-xr-x 2 root root 4.0K Apr 12 2016 home drwxr-xr-x 8 root root 4.0K Oct 19 05:39 lib drwxr-xr-x 2 root root 4.0K Oct 6 01:43 media drwxr-xr-x 2 root root 4.0K Oct 6 01:43 mnt drwxr-xr-x 2 root root 4.0K Oct 6 01:43 opt dr-xr-xr-x 143 root root 0 Oct 19 06:43 proc drwx------ 2 root root 4.0K Oct 19 05:39 root drwxr-xr-x 5 root root 4.0K Oct 6 01:44 run drwxr-xr-x 2 root root 4.0K Oct 19 05:39 sbin drwxr-xr-x 2 root root 4.0K Oct 6 01:43 srv dr-xr-xr-x 12 root root 0 Oct 19 06:43 sys drwxrwxrwt 2 root root 4.0K Oct 6 01:44 tmp drwxr-xr-x 10 root root 4.0K Oct 19 05:39 usr drwxr-xr-x 11 root root 4.0K Oct 19 05:39 var root@87a3ea8fecdd:/# ls -lah /var/lib/apt total 24K drwxr-xr-x 6 root root 4.0K Oct 19 05:39 . drwxr-xr-x 11 root root 4.0K Oct 19 05:39 .. -rw-r--r-- 5 root root 0 Oct 6 01:44 extended_states drwxr-xr-x 2 root root 4.0K Oct 19 05:39 keyrings drwxr-xr-x 2 root root 4.0K Oct 11 14:01 lists drwxr-xr-x 3 root root 4.0K Oct 19 05:39 mirrors drwxr-xr-x 2 root root 4.0K Apr 14 2016 periodic root@87a3ea8fecdd:/# ls -lah /usr/share total 160K drwxr-xr-x 40 root root 4.0K Oct 19 05:39 . drwxr-xr-x 10 root root 4.0K Oct 19 05:39 .. drwxr-xr-x 2 root root 4.0K Oct 19 05:39 adduser drwxr-xr-x 3 root root 4.0K Oct 19 05:39 apport drwxr-xr-x 2 root root 4.0K Oct 19 05:39 base-files drwxr-xr-x 2 root root 4.0K Oct 19 05:39 base-passwd drwxr-xr-x 3 root root 4.0K Oct 19 05:39 bash-completion drwxr-xr-x 6 root root 4.0K Oct 19 05:39 bug drwxr-xr-x 2 root root 4.0K Oct 19 05:39 common-licenses drwxr-xr-x 4 root root 4.0K Oct 19 05:39 dbus-1 drwxr-xr-x 2 root root 4.0K Oct 19 05:39 debconf drwxr-xr-x 2 root root 4.0K Oct 19 05:39 debianutils drwxr-xr-x 2 root root 4.0K Apr 12 2016 dict drwxr-xr-x 94 root root 4.0K Oct 19 05:39 doc ... root@df3ef4561fc3:/# lsof /usr/share/doc root@df3ef4561fc3:/# rm -rf /usr/share/doc rm: cannot remove '/usr/share/doc/sed': Directory not empty rm: cannot remove '/usr/share/doc/libpam-modules': Directory not empty rm: cannot remove '/usr/share/doc/util-linux': Directory not empty rm: cannot remove '/usr/share/doc/mawk': Directory not empty rm: cannot remove '/usr/share/doc/gnupg': Directory not empty rm: cannot remove '/usr/share/doc/apt': Directory not empty rm: cannot remove '/usr/share/doc/libreadline6': Directory not empty rm: cannot remove '/usr/share/doc/adduser/examples/adduser.local.conf.examples': Directory not empty rm: cannot remove '/usr/share/doc/passwd': Directory not empty rm: cannot remove '/usr/share/doc/mount': Directory not empty rm: cannot remove '/usr/share/doc/procps': Directory not empty 

Rmdir也不起作用

 root@df3ef4561fc3:/# rmdir /usr/share/doc rmdir: failed to remove '/usr/share/doc': Directory not empty root@df3ef4561fc3:/# lsof /usr/share/doc 

直接运行rm命令也是如此

 $ docker run --rm -it arm64v8/ubuntu:latest rm -rf /usr/share/doc rm: cannot remove '/usr/share/doc/sed': Directory not empty rm: cannot remove '/usr/share/doc/libpam-modules': Directory not empty rm: cannot remove '/usr/share/doc/util-linux': Directory not empty rm: cannot remove '/usr/share/doc/mawk': Directory not empty rm: cannot remove '/usr/share/doc/gnupg': Directory not empty rm: cannot remove '/usr/share/doc/apt': Directory not empty rm: cannot remove '/usr/share/doc/libreadline6': Directory not empty rm: cannot remove '/usr/share/doc/adduser/examples/adduser.local.conf.examples': Directory not empty rm: cannot remove '/usr/share/doc/passwd': Directory not empty rm: cannot remove '/usr/share/doc/mount': Directory not empty rm: cannot remove '/usr/share/doc/procps': Directory not empty 

和sudo

 $ sudo docker run --rm -it arm64v8/ubuntu:latest rm -rf /usr/share/doc rm: cannot remove '/usr/share/doc/sed': Directory not empty rm: cannot remove '/usr/share/doc/libpam-modules': Directory not empty rm: cannot remove '/usr/share/doc/util-linux': Directory not empty rm: cannot remove '/usr/share/doc/mawk': Directory not empty rm: cannot remove '/usr/share/doc/gnupg': Directory not empty rm: cannot remove '/usr/share/doc/apt': Directory not empty rm: cannot remove '/usr/share/doc/libreadline6': Directory not empty rm: cannot remove '/usr/share/doc/adduser/examples/adduser.local.conf.examples': Directory not empty rm: cannot remove '/usr/share/doc/passwd': Directory not empty rm: cannot remove '/usr/share/doc/mount': Directory not empty rm: cannot remove '/usr/share/doc/procps': Directory not empty 

这不是Docker问题中已知的问题 。 如何进一步debugging问题?

在Docker覆盖存储驱动程序报告为无法从基础图像层#35257删除目录的问题后,我得到了它的底部,谢谢thaJeztah。

https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/所述,覆盖存储驱动程序需要内核版本3.18或更高版本。

我的系统使用ArchLinuxARM-odroid-c2-latest.tar.gz ,它有一个较旧的内核版本3.14。

发生这个问题是因为ALARM docker软件包默认configuration了overlay驱动程序,只能在较新的内核版本(例如RPi映像或ODROID-C2的主线内核)上运行。

因此,解决scheme是要么

  • 升级内核版本。 我上次检查时,ODROID-C2的主线内核支持有问题,所以下一个选项可能会更好。
  • 或者将dockerconfiguration为使用AUFS存储驱动程序而不是覆盖驱动程序。