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"文件夹