在没有调试模式的情况下,默认工作进程不会在 docker 中启动

Default worker process does not start in docker without debug mode

也许这是显而易见的事情,但无法弄清楚。

我刚刚在 Visual Studio(2022,.NET 6)中有了开箱即用的 C# Worker 服务解决方案。 Docker 支持开启。当我按下 'Debug' - 它启动 docker 容器并运行应用程序。控制台上的一切看起来都很好(默认情况下它只是每 1 秒写入一次消息。)

现在,如果我离开 VS 并打开 CMD 并输入:

docker ps

我会看到在 Visual Studio 运行时创建的图像。如果我尝试通过以下方式启动它:

docker run workerservicedocker:dev

我得到了像这样的快速输出:

所以实际上没有代码执行。看起来应用程序正在立即获得 opened/closed。我只是在尝试 Docker 方法,所以也许我遗漏了一些明显的东西。正如我所提到的,它只是默认模板解决方案,我这边没有进行任何修改。 在此先感谢您的关注。

Docker文件是:

FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WorkerServiceDocker/WorkerServiceDocker.csproj", "WorkerServiceDocker/"]
RUN dotnet restore "WorkerServiceDocker/WorkerServiceDocker.csproj"
COPY . .
WORKDIR "/src/WorkerServiceDocker"
RUN dotnet build "WorkerServiceDocker.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WorkerServiceDocker.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WorkerServiceDocker.dll"]

这是由 VS 创建的默认 Docker文件。

更新:

如果我这样做

docker run -it  workerservicedocker:dev

就像下面回复中建议的那样 - 它只显示 app> 命令行,但没有实际执行。

docker run -it workerservicedocker:dev 附上 stdin 和一个 psuedo-tty

基本上,您 运行 它的方式是在“后台”。 如果你 docker ps 你会看到你的容器 运行ning。 获取容器 ID,docker logs <id>,您将看到您的输出。

使用 -it 它有效地将容器附加到您的控制台。 当您从 VS 运行 时,它会为您执行此操作。


补充: 实际问题是 VS 很“聪明” “:dev”标签只是基础阶段(基本上什么都没有)。然后 VS 注入代码并构建。它为编辑继续、调试等执行此操作。 (检查 output/container-tools window。参见“--target base”参数)

右键单击 Docker 文件和 select“构建 Docker 映像”。这实际上 运行 是整个 dockerfile 并给你一个“:latest”标签,它将包含你所期望的。

docker run -it workerservicedocker:latest