dotnet watch 在 docker 中崩溃?
Posted
技术标签:
【中文标题】dotnet watch 在 docker 中崩溃?【英文标题】:dotnet watch crashes in docker? 【发布时间】:2021-07-06 22:28:18 【问题描述】:当我尝试通过 docker(在 Windows、wsl 上)运行 dotnet watch
时,我收到类似 Unhandled exception. System.ArgumentException: An item with the same key has already been added. Key: /src/bin/Debug/net5.0/Tickets.runtimeconfig.json
的错误。 Key: ...
总是不同的。
此错误有时在构建时发生:
app-watch_1 | Building...
app-watch_1 | Unhandled exception. System.ArgumentException: An item with the same key has already been added. Key: /src/bin/Debug/net5.0/Tickets.runtimeconfig.json
但有时构建成功,但在其他时间随机出现错误。
这似乎发生在干净的项目中。我使用创建了一个新项目(这是仍然有效的部分):
dotnet new web
然后添加了一个docker文件:
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers as an optimizations
COPY *.csproj ./
RUN dotnet restore
# Copy the rest
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image without all the bagage from the build steps
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "Tickets.dll"]
添加了docker-compose.yml
文件:
version: '3.4'
services:
tickets:
build:
context: .
ports:
- 8880:80
然后运行它:docker-compose build
然后docker-compose up
。这很好用。
然后我尝试将服务添加到我的 docker-compose 文件以使用dotnet watch
:
(完整的 docker 文件)
version: '3.4'
services:
tickets:
build:
context: .
ports:
- 8880:80
tickets-watch:
image: mcr.microsoft.com/dotnet/sdk:5.0
ports:
- 8881:80
volumes:
- ./:/src
working_dir: /src
command: dotnet watch run --urls=http://+:80
当我再次尝试docker-compose up
时,我有时会收到错误消息。在其他时候,构建成功。看来,一旦构建成功一次,就可以了。但是当我退出 docker 时,删除 bin
和 obj
文件夹,然后再次启动 docker,又有机会会失败。
以下是我尝试过的一些东西(我确定我尝试了更多东西,但不记得全部了,抱歉。):
我认为这可能与我在同一个文件夹中打开了 VSCode 有关,所以我添加了一个 Directory.Build.props
文件:
<Project>
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);$(MSBuildProjectDirectory)/obj/**/*</DefaultItemExcludes>
<DefaultItemExcludes>$(DefaultItemExcludes);$(MSBuildProjectDirectory)/bin/**/*</DefaultItemExcludes>
</PropertyGroup>
<PropertyGroup Condition="'$(DOTNET_RUNNING_IN_CONTAINER)' == 'true'">
<BaseIntermediateOutputPath>$(MSBuildProjectDirectory)/obj/container/</BaseIntermediateOutputPath>
<BaseOutputPath>$(MSBuildProjectDirectory)/bin/container/</BaseOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(DOTNET_RUNNING_IN_CONTAINER)' != 'true'">
<BaseIntermediateOutputPath>$(MSBuildProjectDirectory)/obj/local/</BaseIntermediateOutputPath>
<BaseOutputPath>$(MSBuildProjectDirectory)/bin/local/</BaseOutputPath>
</PropertyGroup>
</Project>
这没有帮助。
我还删除了 docker 桌面,并在 WSL 中安装了 docker(如下:https://dev.to/bowmanjd/install-docker-on-windows-wsl-without-docker-desktop-34m9),但这也没有帮助。
我尝试在我的 Linux 电脑上运行相同的项目,它运行良好。所以def似乎是windows/wsl的东西。
谢谢!
【问题讨论】:
【参考方案1】:我相信我自己解决了这个问题,方法是将代码移动到 WSL 上的主文件夹中,而不是将其放在我的 c 驱动器上(然后通过 /mnt/c/...
访问它)。
所以,当我的代码位于 /mnt/c/Users/Pablo/Dev/Tickets
时,我遇到了崩溃。
然后我将我的代码放入~/dev/Tickets
,崩溃就消失了。
【讨论】:
你找到真正的原因了吗?您的回答也为我解决了这个问题,但对我的工作流程来说有点忙。无法每次都复制粘贴代码到 WSL 主目录 遗憾的是我没有:(我只是暂时将我的 .net 项目保留在 WSL 中。以上是关于dotnet watch 在 docker 中崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
dotnet watch+vs code提升asp.net core开发效率