簡體   English   中英

如何在 .net 項目的 docker 構建完成后啟動多個微服務?

[英]How to start multiple microservices after docker build finished for .net projects?

我有一個 .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.dllJobRunner.dll 但是,我只能在 Dockerfile 中啟動其中一個。

這似乎很浪費,因為恢復解決方案是ServerJobRunner項目的常見步驟。 此外,這一行RUN dotnet publish -c Release -o outServerJobRunner生成可執行文件。 我可以為每個項目編寫一個單獨的 Dockerfile 但這似乎是多余的,因為每個項目的 99% 的構建步驟都是相同的。

有沒有辦法在不使用腳本的情況下從單個文件啟動 2 個可執行文件(我不希望這兩個服務都在單個容器中啟動)? 我發現的最接近的是 docker 構建中的--target選項,但它可能不起作用,因為我需要多個入口點。

在您的 Dockerfile 中,在最后一行將CMD ENTRYPOINT

完成此操作后,您可以通過在docker run命令中的映像名稱后提供替代命令來覆蓋該命令:

docker run ... my-image \
  dotnet JobRunner.dll

(In principle you can do this without changing the Dockerfile, but the docker run construction is awkward, and there's no particular benefit to using ENTRYPOINT here. If you're using Docker Compose, you can override either entrypoint: or command: on a container - 以容器為基礎。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM