我在 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