在没有调试模式的情况下,默认工作进程不会在 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
也许这是显而易见的事情,但无法弄清楚。
我刚刚在 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