在Linux Docker镜像上安装多个dotnet core版本

8

我该如何在Linux的docker容器中运行和安装多个版本的dotnet core框架(例如2.1和1.1)?

下面是我的当前dockerfile,并且我也想添加dotnet 1.1到其中。

FROM microsoft/dotnet:2.1.403-sdk-bionic

ENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE true
ENV DOTNET_CLI_TELEMETRY_OPTOUT true

RUN apt-get update && \
    apt-get install -y zip  
2个回答

16
你可以从每个镜像中简单地复制运行时。
例如,使用此Dockerfile可获得.NET 5.0 + .NET Core 3.1 + .NET Core 2.1 + ASP.NET运行时:
# Start with .NET Core 2.1 runtime.
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1

# Add .NET Core 3.1 runtime.
COPY --from=mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim /usr/share/dotnet /usr/share/dotnet

# Add .NET 5.0 runtime.
COPY --from=mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim /usr/share/dotnet /usr/share/dotnet

构建和运行:

$ docker build -t my-image . && docker run --entrypoint dotnet my-image --list-runtimes
#1 [internal] load build definition from Dockerfile

... omitted for brevity ...

#4 [stage-0 1/3] FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
#4 sha256:7d63f34a82584570b0e746ac940d81e903407f58f85148263fc25428d5437fa8
#4 DONE 0.0s

#6 [stage-0 2/3] COPY --from=mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim /usr/share/dotnet /usr/share/dotnet
#6 sha256:cddc840a53b9711f017ed9e285efd2d27cfc0216fc1c2fb5f2383a2f52fbf735
#6 CACHED

#8 [stage-0 3/3] COPY --from=mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim /usr/share/dotnet /usr/share/dotnet
#8 sha256:d34576b2af16f150960c3b5a974d34bf97568dbc42899e359bb1bac6dc584307
#8 CACHED

#9 exporting to image
#9 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00
#9 exporting layers done
#9 writing image sha256:61c1518c7fb1bffff0ca77410e2a5be5febae9669fb6dc695edb053190ad98c3 done
#9 naming to docker.io/library/my-image done
#9 DONE 0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
Microsoft.AspNetCore.All 2.1.30 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.30 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.18 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.9 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.1.30 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.18 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.9 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

这将覆盖CLI工具/usr/share/dotnet/dotnet的旧版本,这可能不是你想要的。在复制之前,您可以运行RUN mkdir /dotnet-backup && find /usr/share/dotnet -maxdepth 1 -type f -exec cp -l {} /dotnet-backup/ \;,然后在复制后运行RUN mv /dotnet-backup/* /usr/share/dotnet/ && rmdir /dotnet-backup以保留.NET 5.0版本。 - Mark Raymond
@MarkRaymond 你说得对。我同意。我已经颠倒了步骤的顺序,这样最新的运行时现在会覆盖旧的运行时。 - Pang

6
这里有一个多个Dotnet Core框架的示例。
FROM microsoft/dotnet:2.2-runtime-deps-stretch-slim

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        curl \
        wget \
        gpg \
        apt-transport-https \
    && rm -rf /var/lib/apt/lists/*

RUN apt-get update

# Install .NET Core Runtime v1.1.2
ENV DOTNET_VERSION 1.1.2
ENV DOTNET_DOWNLOAD_URL https://dotnetcli.blob.core.windows.net/dotnet/release/1.1.0/Binaries/$DOTNET_VERSION/dotnet-debian-x64.$DOTNET_VERSION.tar.gz

RUN curl -SL $DOTNET_DOWNLOAD_URL --output dotnet.tar.gz \
    && mkdir -p /usr/share/dotnet \
    && tar -zxf dotnet.tar.gz -C /usr/share/dotnet \
    && rm dotnet.tar.gz \
    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

# Install ASP.NET Core
ENV ASPNETCORE_VERSION 2.2.1
RUN curl -SL --output aspnetcore.tar.gz https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/$ASPNETCORE_VERSION/aspnetcore-runtime-$ASPNETCORE_VERSION-linux-x64.tar.gz \
    && aspnetcore_sha512='e027a5dada5d139a44675f28090f996375e49fbd72f7897aa925e48803632d5bf187d4f22dc8225505ac33e6a7a05dcdd8ed19d8b6d5e46b22e628315cf13e3e' \
    && echo "$aspnetcore_sha512  aspnetcore.tar.gz" | sha512sum -c - \
    && mkdir -p /usr/share/dotnet \
    && tar -zxf aspnetcore.tar.gz -C /usr/share/dotnet \
    && rm aspnetcore.tar.gz \
    && ln -sf /usr/share/dotnet/dotnet /usr/bin/dotnet

以下是在该实例内的结果:

root@cb87fda4dfc7:/# dotnet --info

Host (useful for support):
  Version: 2.2.1
  Commit:  878dd11e62

.NET Core SDKs installed:
  No SDKs were found.

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.2.1 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.2.1 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 1.1.2 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.2.1 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

我在尝试运行dotnet build后遇到了错误 true 您是否想要运行dotnet SDK命令?请从以下链接安装dotnet SDK: https://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409 - Varun
你需要根据自己的需求更新脚本。不要犹豫,根据文档添加正确的脚本以安装所需内容。 - callmemath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接