docker - .net 项目的 docker build 完成后如何启动多个微服务?
问题描述
我有一个 .net 解决方案,它有 2 个项目,每个项目都是一个微服务(一个服务器)。我有一个 dockerfile,它首先安装两个项目使用的所有依赖项。然后我发布解决方案:
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.sln .
COPY Server/*.csproj ./Server/
COPY JobRunner/*.csproj ./JobRunner/
RUN dotnet restore ./MySolution.sln
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build /app/out .
ENTRYPOINT ["dotnet", "Server.dll"]
发布解决方案时,有 2 个可执行文件可用:Server.dll
和JobRunner.dll
. 但是,我只能在 Dockerfile 中启动其中一个。
这似乎很浪费,因为恢复解决方案是项目双方的共同Server
步骤JobRunner
。此外,这一行还为和RUN dotnet publish -c Release -o out
生成了一个可执行文件。我可以为每个项目编写一个单独的 Dockerfile,但这似乎是多余的,因为每个项目的 99% 的构建步骤都是相同的。Server
JobRunner
有没有办法在不使用脚本的情况下从单个文件启动 2 个可执行文件(我不希望两个服务都在单个容器中启动)?我发现的最接近的是 docker build 中的--target
选项,但它可能不起作用,因为我需要多个入口点。
解决方案
在您的 Dockerfile 中,更改ENTRYPOINT
为CMD
最后一行。
完成此操作后,您可以通过在命令中的图像名称后提供备用命令来覆盖该docker run
命令:
docker run ... my-image \
dotnet JobRunner.dll
(原则上,您可以在不更改 Dockerfile 的情况下执行此操作,但docker run
构造很笨拙,在这里使用并没有特别的好处ENTRYPOINT
。如果您使用的是 Docker Compose,您可以覆盖其中一个,entrypoint:
也可以command:
逐个容器覆盖。)
推荐阅读
- awk - Bash count 数字的数量
- javascript - 从提交和页面加载后保留范围值
- c++ - 为什么我的删除指针的 C++ 函数会安全地抛出错误?
- javascript - 如何使用量角器计算孩子的数量
- javascript - 无法在Vue中过滤其中包含三个数组的数组
- webview - 如何修复 UWP webview 不处理 307 临时重定向
- jquery - 关闭一个模态窗口(局部视图)并打开另一个模态窗口(局部视图)不起作用
- java - 避免 java 构造函数中的逻辑
- pandas - 将数据透视表转换为常规数据框
- matlab - 如何简化我的 matlab 代码?找不到可以正常工作的方法