MSYS2 无法删除 Windows docker 卷中的文件

MSYS2 cannot delete file in Windows docker volume

我遇到了一个问题,即 docker 中的 MSYS2 运行 可以在已安装的卷中创建和修改文件,但不能删除它们。这可以通过显式删除的命令观察到,例如 rm a.txt,或者使用隐式删除的命令,例如 sed -i 's/foo/bar/' b.txt(b.txt 应该就地编辑,并且似乎从输出 (1) 中读取、删除和重新创建)。可以使用等效的 DOS 命令删除相同的文件,例如 del a.txt.

使用以下 Docker 文件:

# Altered from https://github.com/StefanScherer/dockerfiles-windows/blob/main/msys2/Dockerfile
FROM mcr.microsoft.com/windows/servercore:20H2

RUN powershell -Command \
    $ProgressPreference = 'SilentlyContinue' ; \
    Write-Output 'Downloading msys2' ; \
    curl.exe -o msys2.tar.xy http://repo.msys2.org/distrib/msys2-x86_64-latest.tar.xz ; \
    Install-Package -Scope CurrentUser -Force 7Zip4Powershell ; \
    Write-Output 'Extracting tar.xz' ; \
    Expand-7zip msys2.tar.xy . ; \
    Write-Output 'Extracting tar' ; \
    Expand-7zip msys2.tar C:/ ; \
    Write-Output 'Done'

RUN powershell -Command \
    setx /M PATH $('C:\msys64\mingw64\bin;C:\msys64\usr\bin;C:\msys64\mingw32\bin;' + $Env:PATH)

构建并启动容器:

docker pull mcr.microsoft.com/windows/servercore:20H2
docker build -t docker-msys .
mkdir local
docker run -ti -v "$(pwd)/local:C:/local" docker-msys cmd.exe

使用容器内的 MSYS2 命令,让我们通过以下方式操作文件:

touch a.txt
cp a.txt b.txt
rm a.txt
rm -f b.txt
ls *.txt

如果从非挂载目录启动,会出现以下情况:

C:\>touch a.txt
C:\>cp a.txt b.txt
C:\>rm a.txt
C:\>rm -f b.txt
C:\>ls *.txt
ls: cannot access '*.txt': No such file or directory

两个文件都已按预期删除。

如果从挂载目录启动,此处 C:\local,将观察到以下内容:

cd C:\local
C:\local>touch a.txt
C:\local>cp a.txt b.txt
C:\local>rm a.txt
rm: cannot remove 'a.txt': Invalid argument
C:\local>rm -f b.txt
C:\local>ls *.txt
a.txt  b.txt

两个文件仍然存在。

其他 MSYS 命令将在挂载目录中出现意外行为:

C:\local>sed -i 's/foo/bar/' b.txt
sed: cannot remove ./sed7E6QmG: Invalid argument

可以使用等效的 dos 命令从挂载目录中删除文件:

C:\local>del /Q *

C:\local>dir
 Volume in drive C has no label.
 Volume Serial Number is 541F-A7C7

 Directory of C:\local

11/26/2020  04:05 PM    <DIR>          .
11/26/2020  04:05 PM    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  48,827,674,624 bytes free

从挂载目录更改为命名卷对这种情况没有任何影响。当容器启动时之前的输出是相同的:

docker volume create local-volume
docker run -ti -v local-volum:C:/local docker-msys cmd

问题似乎与我的 Docker 文件无关。我能够使用来自 https://hub.docker.com/r/mizarjp/winci-msys2 的容器重现它。

docker pull mizarjp/winci-msys2:1909
docker run -ti --rm -v "$(pwd)/local:C:/local" mizarjp/winci-msys2:1909 cmd.exe

进入容器后,执行 set PATH=C:\msys64\mingw64\bin;C:\msys64\usr\bin;C:\msys64\mingw32\bin;%PATH%;,然后重复前面的测试以获得相同的结果。

最后,不是在 docker 中安装 MSYS2,而是在容器中安装它的目录会产生相同的情况。

有什么我遗漏的吗?

详情:

(1)我的拙见!

添加 --isolation=process 修复了它。 rm 我不再失败了!

docker pull mcr.microsoft.com/windows/servercore:20H2
docker build -t docker-msys .
mkdir local
docker run --rm -ti --isolation=process -v "$(pwd)/local:C:/local" docker-msys cmd.exe

重新运行之前的命令产生:

C:\>cd local
C:\local>touch a.txt
C:\local>cp a.txt b.txt
C:\local>rm a.txt
C:\local>rm -f b.txt
C:\local>ls *.txt
ls: cannot access '*.txt': No such file or directory