dotnet core File.Move issue



My Dockerfile is this

FROM mcr.microsoft.com/dotnet/core/runtime:3.0
COPY publish/ app/
RUN mkdir -p /in
RUN mkdir -p /tmp
ENTRYPOINT ["dotnet", "app/Watcher.dll"]

我用这个命令构建映像

docker build -t watcher/sl_user_test:1.1 .

所以,我的码头工人组合是这个

watcher.sl_user_test:
  image: watcher/sl_user_test:1.1
  container_name: watcher_sl_user_test
  build: .
  restart: always
  volumes:
    - /var/storage/in:/in:z
    - /var/storage/tmp:/tmp:z

在我的 dotnet 核心应用程序中,我在/in 文件夹中获取一个文件,并将其移动到/tmp/aaa 代码是这样的

string destination = $"/tmp/{Guid.NewGuid()}/git.zip";
new FileInfo(destination).Directory.Create();
File.Move("/in/git.zip", destination, true);

问题是这个命令复制文件并且不移动它,为什么? 如果我进入容器,我可以从 bash 做 mv 并且它可以工作

由于要在路径中创建新的 GUID,因此可以保证该目录尚不存在。 因此File.Move会抛出DirectoryNotFoundException.

在移动文件之前创建它。

var tmpDir = $"/tmp/{Guid.NewGuid()}";
Directory.CreateDirectory(tmpDir);
File.Move("/in/git.zip", $"{tmpDir}/git.zip", true);

假设您正在这样做,如果 File.Move 方法只是执行复制而不是移动,则很可能正在使用原始文件。 从文档(在"备注"部分(:

如果尝试跨磁盘卷移动文件,并且该文件正在使用中,则会将该文件复制到目标,但不会从源中删除该文件。

问题是我正在尝试将文件从一个卷移动到另一个卷。 如果您在 GoLang 中尝试此代码,则会收到此错误

"rename /dir1/test.txt /dir2/test.txt: invalid cross-device link"

所以,解决方案是

  • 编写自己的文件移动功能(带复制和删除源(
  • 仅使用一个卷

所以,就我而言,从这个

volumes:
  - /var/storage/in:/in:z
  - /var/storage/tmp:/tmp:z

我会这样做

volumes:
  - /var/storage/data/:/data:z

在/data 中有"in"和"tmp"文件夹

最新更新