我的Dockerfile是这个
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 .
所以,我的docker-compose是这个
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,并且可以运行
答案 0 :(得分:1)
由于要在路径中创建新的GUID,因此保证该目录不存在。因此File.Move
将抛出DirectoryNotFoundException
。
在移动文件之前创建它。
var tmpDir = $"/tmp/{Guid.NewGuid()}";
Directory.CreateDirectory(tmpDir);
File.Move("/in/git.zip", $"{tmpDir}/git.zip", true);
假设您正在执行此操作,如果File.Move
方法仅执行复制操作而不是移动操作,则很可能正在使用原始文件。从the docs(在备注部分中):
如果您尝试跨磁盘卷移动文件,并且该文件正在使用中,则该文件将复制到目标位置,但不会从源中删除。
答案 1 :(得分:0)
问题是我正在尝试将文件从一个卷移动到另一个。 如果您在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”文件夹