由于vmwp.exe文件锁定,Visual Studio在将文件复制到bin目录时构建失败

13

我正在使用Docker容器运行我的开发环境。由于进行了一些更新,当我尝试重新构建在Docker容器中运行的项目时,现在遇到了一些困难。

我的项目运行在运行IIS的Windows Server Core Docker容器中,我从主机上的共享卷中运行该项目。在启动Docker容器之前,我可以构建该项目,但是在启动Docker容器之后,构建失败,并显示以下错误:

Could not copy "C:\path\to\dll\name.dll" to "bin\name.dll". Exceeded retry count of 10. Failed. The file is locked by: "vmwp.exe (22604), vmmem (10488)"

看起来是Hyper-V进程锁定了DLL文件。 显然,在此之前并不是这种情况,这似乎与我所做的一些Docker或Windows更新有关。 我该如何解决这个问题? 我需要更改构建应用程序和在Docker容器中运行它的流程吗?

我已经搜索了一段时间,但没有找到关于这个特定问题的太多信息。 任何帮助都将不胜感激。 预先感谢您!


有趣的反馈,谢谢。在我的情况下,似乎是本地构建和容器内构建(不同时进行 :-))的组合导致了这个问题。我想保留两者的灵活性,因为容器稍微慢一些。 - vipes
我已经尝试过杀掉应用程序池、杀掉IIS、杀掉容器内的各种东西,但我认为文件上的锁定是由主机上的实际Hyper-V进程持有的,只有在停止容器时才会放弃它。 - theyetiman
1
重现“dotnet watch”问题的存储库--https://github.com/nickwesselman/dotnet-docker-lock-issue - nickwesselman
1
已使用docker/for-win记录此问题...如果有+1的话会很有帮助。https://github.com/docker/for-win/issues/12028 - nickwesselman
2
Docker 将我重定向到 Moby 项目以记录此问题:https://github.com/moby/moby/issues/42803 - nickwesselman
显示剩余9条评论
2个回答

3

我遇到了类似的问题。通过停止/删除在docker-for-windows界面中正在运行的应用程序容器来解决。 docker rm -f 也可以。


如果 Docker 桌面正在运行,则可以在“操作”标题下选择容器并单击“停止”。 - Thane Plummer

0

可能的解决方案:

  1. 如果您使用Docker Windows容器,请确保您的物理机和Docker环境都至少安装了Windows 10.0.1809 - 运行CMD并在其顶部查看。
  2. 在运行docker时,使用进程隔离标志:--isolation process。

在物理机上,两个vmxxx(较低和较高PID)(不记得确切名称)进程正在保留*.dll文件(构建正在Docker侧进行,其中使用了构建工具2019)。

简短描述:

  1. 首先,MSbuild错误发生是因为msbuild尝试删除文件 - 访问被拒绝 - 可能是其中一个vm进程处理该文件。
  2. 第二个Msbuild错误发生(第一个vmxxx导致)显示从一个方向复制相同的dll文件到另一个方向是不可能的,因为系统锁定(4)。

这两个vmxxx进程在Docker构建期间保留了一个dll文件。它在“Process Explorer”工具中可见(使用Sysinternals的完整版本) 一个vmxxx具有较低的PID编号,锁定了dll文件,并且在具有较高PID编号的第二个进程尝试对其执行某些操作之前不释放它。 而且,这是一个随机的dll文件,由两个不同的进程保留。

此外,在 msbuild 上仅使用和定义一个 CPU 而不进行并行处理并不能解决问题。在 docker 上也是如此,您可以管理 CPU 和内存。最终,在 docker 上进行隔离解决了该问题。

当您从 docker 容器中构建项目时,隔离应该能够处理进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接