You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dockerfile中sed命令无法替换ARG变量的问题求助

问题解决

核心问题分析

  1. ARG变量作用域限制:你在base阶段声明的API_GATEWAY_STAGE_NAME仅在该阶段生效,build阶段无法直接访问这个变量,必须在build阶段重新声明该ARG才能传递参数值。
  2. sed命令转义错误:原命令使用/作为分隔符,同时又在替换字符串中包含/,导致转义逻辑混乱,间接影响了变量的正常展开。

修改后的Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /WebAdmin
EXPOSE 80
EXPOSE 443
ARG API_GATEWAY_STAGE_NAME
RUN echo "API_GATEWAY_STAGE_NAME is $API_GATEWAY_STAGE_NAME" 

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
# 关键:在build阶段重新声明ARG,才能接收外部传入的参数值
ARG API_GATEWAY_STAGE_NAME
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["MyApp.Web.Admin/MyApp.Web.Admin.csproj", "MyApp.Web.Admin/"]
RUN dotnet restore "./MyApp.Web.Admin/./MyApp.Web.Admin.csproj"
COPY . .
WORKDIR "/src/MyApp.Web.Admin"
# 改用|作为sed分隔符,避免斜杠转义混乱,确保变量正常展开
RUN sed -i "s|~/|/${API_GATEWAY_STAGE_NAME}/|g" ./Views/Shared/_Layout.cshtml
RUN more ./Views/Shared/_Layout.cshtml
RUN dotnet build "./MyApp.Web.Admin.csproj" -c $BUILD_CONFIGURATION -o /WebAdmin/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./MyApp.Web.Admin.csproj" -c $BUILD_CONFIGURATION -o /WebAdmin/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /WebAdmin
COPY --from=publish /WebAdmin/publish .
ENTRYPOINT ["dotnet", "MyApp.Web.Admin.dll"]

关键修改说明

  • 扩展ARG作用域:在build阶段开头添加ARG API_GATEWAY_STAGE_NAME,让该阶段可以获取构建时传入的参数值(通过--build-arg API_GATEWAY_STAGE_NAME=xxx传入)。
  • 调整sed分隔符:将sed命令的分隔符从/替换为|,这样无需对替换字符串中的/进行转义,既简化了命令写法,也避免了转义错误导致的变量展开失效。

验证方法

执行构建命令时传入参数测试:

docker build --build-arg API_GATEWAY_STAGE_NAME=prod -t myapp-admin .

查看构建日志中more命令的输出,确认~/已被正确替换为/prod/。

内容的提问来源于stack exchange,提问作者Damien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:17:49