Windows 容器内的 Cygwin、coreutils 在卷中不起作用

Windows 容器内的 Cygwin、coreutils 在卷中不起作用

我在 Windows Docker 容器内设置了 Cygwin,但在 Docker 卷中执行时一些常见操作失败。

例子:

$ mkdir foo bar
$ mv foo bar
mv: cannot move 'bar' to a subdirectory of itself, 'foo/bar'
$ ls foo
$ ls bar
$ rmdir foo bar
rmdir: failed to remove 'foo': Invalid argument
rmdir: failed to remove 'bar': Invalid argument

这些命令在主文件系统中运行良好,但在附加卷(使用 创建docker volume create和安装-v volume:mountpoint)中返回错误。如果我切换到 PowerShell 提示符,我就可以毫无问题地移动和删除文件夹。

如果我尝试运行,strace mv foo bar我会获得以下信息

  [...]
  260  126481 [main] mv 1661 path_conv::check: this->path(C:\ext-libs\bar\foo), has_acls(1)
  463  126944 [main] mv 1661 seterrno_from_nt_status: /home/corinna/src/cygwin/cygwin-3.2.0/cygwin-3.2.0-1.x86_64/src/newlib-cygwin/winsup/cygwin/syscalls.cc:2834 status 0xC000000D -> windows error 87
  313  127257 [main] mv 1661 geterrno_from_win_error: windows error 87 == errno 22
  216  127473 [main] mv 1661 rename2: -1 = rename(foo, bar/foo), errno 22
  [...]

我在 Windows 1909 上使用映像mcr.microsoft.com/windows:1909,Docker 版本为 20.10.6 build 370c289。

为了安装 Cygwin,我使用了一个简单的 BAT 脚本,该脚本运行官方安装程序并预安装一些有用的软件包。

我不确定我是否对 Cygwin 期望过高或者我是否错过了其他东西。

答案1

我在 Windows docker 容器中使用 Git bash 时遇到了同样的问题。

一种解决方法是将文件复制到 docker 卷之外,然后将其移回内部并重命名:

cp foo /c/
mv /c/foo bar

相关内容