.net 项目 docker 构建完成后如何启动多个微服务?
How to start multiple microservices after docker build finished for .net projects?
我有一个 .net 解决方案,它有 2 个项目,每个项目都是一个微服务(一个服务器)。我有一个 docker 文件,它首先安装两个项目使用的所有依赖项。然后我发布解决方案:
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
为 Server
和 JobRunner
生成了一个可执行文件。我可以为每个项目编写一个单独的 Dockerfile,但这似乎是多余的,因为每个项目的 99% 的构建步骤都是相同的。
有没有办法在不使用脚本的情况下以某种方式从单个文件启动 2 个可执行文件(我不希望两个服务都在一个容器中启动)?我找到的最接近的是 docker 构建中的 --target
option,但它可能无法工作,因为我需要多个入口点。
在您的 Docker 文件中,将最后一行的 ENTRYPOINT
更改为 CMD
。
执行此操作后,您可以通过在 docker run
命令中的图像名称后提供备用命令来覆盖该命令:
docker run ... my-image \
dotnet JobRunner.dll
(原则上您可以在不更改 Docker 文件的情况下执行此操作,但是 docker run
构造很笨拙,并且在此处使用 ENTRYPOINT
没有特别的好处。如果您如果使用 Docker Compose,您可以逐个容器覆盖 entrypoint:
或 command:
。)
我有一个 .net 解决方案,它有 2 个项目,每个项目都是一个微服务(一个服务器)。我有一个 docker 文件,它首先安装两个项目使用的所有依赖项。然后我发布解决方案:
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
为 Server
和 JobRunner
生成了一个可执行文件。我可以为每个项目编写一个单独的 Dockerfile,但这似乎是多余的,因为每个项目的 99% 的构建步骤都是相同的。
有没有办法在不使用脚本的情况下以某种方式从单个文件启动 2 个可执行文件(我不希望两个服务都在一个容器中启动)?我找到的最接近的是 docker 构建中的 --target
option,但它可能无法工作,因为我需要多个入口点。
在您的 Docker 文件中,将最后一行的 ENTRYPOINT
更改为 CMD
。
执行此操作后,您可以通过在 docker run
命令中的图像名称后提供备用命令来覆盖该命令:
docker run ... my-image \
dotnet JobRunner.dll
(原则上您可以在不更改 Docker 文件的情况下执行此操作,但是 docker run
构造很笨拙,并且在此处使用 ENTRYPOINT
没有特别的好处。如果您如果使用 Docker Compose,您可以逐个容器覆盖 entrypoint:
或 command:
。)