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,而是在容器中安装它的目录会产生相同的情况。
有什么我遗漏的吗?
详情:
- Windows 10 专业版, 20H2, 19042.746
- Docker 桌面版 3.1.0 (51484)
- MSYS2 (http://repo.msys2.org/distrib/msys2-x86_64-latest.tar.xz) 2020-07-03 19:34
(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
我遇到了一个问题,即 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,而是在容器中安装它的目录会产生相同的情况。
有什么我遗漏的吗?
详情:
- Windows 10 专业版, 20H2, 19042.746
- Docker 桌面版 3.1.0 (51484)
- MSYS2 (http://repo.msys2.org/distrib/msys2-x86_64-latest.tar.xz) 2020-07-03 19:34
(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