.NET 7多平台Docker构建:如何在Dockerfile中条件设置目标平台?
解决Dockerfile多平台构建时变量不持久的问题
问题核心是Docker的每个RUN指令都会启动独立的shell进程,进程内定义的变量无法跨RUN指令保留。针对你的场景,提供两种简洁的解决方式:
方式一:合并命令到同一个RUN指令
将变量判断、dotnet restore和dotnet publish放在同一个RUN中,利用shell会话内的变量有效性完成配置:
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env ARG TARGETPLATFORM ARG BUILDPLATFORM RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log WORKDIR /app COPY . ./ # 条件判断与构建命令合并,变量在当前shell会话中有效 RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ DOTNET_TARGET=linux-musl-arm64; \ else \ DOTNET_TARGET=linux-x64; \ fi && \ dotnet restore MyApp -r $DOTNET_TARGET /p:PublishReadyToRun=true && \ dotnet publish MyApp -c Release -o Ahs.AuthManager/out -r $DOTNET_TARGET --self-contained true --no-restore /p:PublishTrimmed=true /p:PublishReadyToRun=true /p:PublishSingleFile=true ## more to follow here...
注意:原代码中"linux/arm64 "多了一个空格,需删除才能正确匹配目标平台。
方式二:使用ARG预定义目标RID
通过ARG定义目标RID参数,结合shell命令将TARGETPLATFORM映射为对应的.NET RID,后续指令直接引用该参数:
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env ARG TARGETPLATFORM ARG BUILDPLATFORM # 默认目标平台为linux-x64 ARG DOTNET_TARGET=linux-x64 RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log && \ # 根据TARGETPLATFORM更新DOTNET_TARGET的值 if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ echo "DOTNET_TARGET=linux-musl-arm64" > /tmp/target_config; \ fi # 将配置文件中的变量导入当前环境,供后续构建命令使用 WORKDIR /app COPY . ./ RUN export $(cat /tmp/target_config 2>/dev/null) && \ dotnet restore MyApp -r $DOTNET_TARGET /p:PublishReadyToRun=true && \ dotnet publish MyApp -c Release -o Ahs.AuthManager/out -r $DOTNET_TARGET --self-contained true --no-restore /p:PublishTrimmed=true /p:PublishReadyToRun=true /p:PublishSingleFile=true ## more to follow here...
这种方式适合需要在多个RUN指令中复用目标平台参数的场景,通过临时文件传递变量值。
内容的提问来源于stack exchange,提问作者silent
相关产品推荐
相关产品推荐

