默认工作进程不会在没有调试模式的 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