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

Posted

技术标签:

【中文标题】默认工作进程不会在没有调试模式的 docker 中启动【英文标题】:Default worker process does not start in docker without debug mode 【发布时间】:2022-01-14 09:20:42 【问题描述】:

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

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

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

docker ps

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

docker run workerservicedocker:dev

我得到快速输出,例如:

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

Dockerfile 是:

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 创建的默认 Dockerfile。

更新:

如果我这样做

docker run -it  workerservicedocker:dev

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

【问题讨论】:

你能发布 Dockerfile 吗? 刚刚添加了它的内容 让我感到奇怪的是,您创建了一个 Linux 映像(mcr.microsoft.com/dotnet/runtime:6.0 是 Linux),但是当您运行它时,它会显示“Microsoft Windows ...”文本,就像Windows 图片。 【参考方案1】:

docker run -it workerservicedocker:dev 附加标准输入和一个伪tty

基本上,您运行它的方式是在“背景”中。 如果您docker ps,您将看到您的容器正在运行。 获取容器 ID,docker logs <id>,您将看到您的输出。

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


补充: 实际问题是VS很“聪明” ":dev" 标签只是基础阶段(基本上没有)。 VS 然后注入代码并构建。它这样做是为了继续编辑、调试等。 (检查输出/容器工具窗口。参见“--target base”参数)

右键单击 Dockerfile 并选择“构建 Docker 映像”。这实际上会运行整个 dockerfile 并为您提供一个 ":latest" 标记,该标记将具有您的预期。

docker run -it workerservicedocker:latest

【讨论】:

谢谢。我已经尝试过了,但它只是将我导航到不执行默认项目的默认实现的控制台。我已更新初始帖子以包含此内容。 我认为我更新的答案解释了这一点。基本上它是VS没有做你认为/期望它做的事情。 --- 对于生产工作,我从不使用 VS 创建的 Dockerfile。当您有大量项目依赖项时,它过于复杂和脆弱 非常感谢!这行得通。看起来我对构建那种类型的项目并不完全清楚:)

以上是关于默认工作进程不会在没有调试模式的 docker 中启动的主要内容,如果未能解决你的问题,请参考以下文章

在调试模式而不是默认模式下运行 docker sonarqube

工具系列 | PHPSTROM 连接Docker容器 && 配置XDEBUG调试

docker 的container模式

Docker 的网络模式

在调试模式下启动工作进程(w3wp.exe)是啥意思?

大厂面试必备:docker退出容器之后会不会保存