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 时,删除 binobj 文件夹,然后再次启动 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 run 命令中的绝对路径不起作用

dotnet watch+vs code提升asp.net core开发效率

运行 dotnet watch run 时如何仅显示错误?

记一次asp.net core 线上崩溃解决总结

如何使用 Visual Studio ASP.NET Core 监视文件更改“dotnet watch”

Apple Watch 崩溃检测