我对
Docker
很陌生(这是我在阅读了一些教程后第一次尝试),并且我陷入了一些看起来很简单的事情。
我的
Dockerfile
中有这行应该构建一个dotnet应用程序,正如你所看到的,我有一个ARG
,我在其中定义构建配置,然后在下一行中将其传递给编译器:
ARG BUILD_CONFIGURATION=Release
RUN dotnet build "MyProject/MyProject.csproj" -c ${BUILD_CONFIGURATION} -o /bin
但是问题是,在构建 Docker 映像时,
${BUILD_CONFIGURATION}
arg 不会扩展,而是按字面形式传递,因此实际调用的构建命令是字面意思:
dotnet build "MyProject/MyProject.csproj" -c ${BUILD_CONFIGURATION} -o /bin
显然编译器不喜欢这样并给了我错误:
MSB3052:编译器的参数无效, '/define:${BUILD_CONFIGURATION}' 将被忽略。
为什么这不起作用?我错过了什么?
注意:我也尝试过不带花括号的
$BUILD_CONFIGURATION
,也尝试过使用 ENV
代替 ARG
,但结果是相同的。
编辑:如果需要一些进一步的信息
docker build .
Dockerfile
#Copy source code into container
WORKDIR /src
COPY . .
#Build application
ARG BUILD_CONFIGURATION=Release
RUN dotnet build "MyProject/MyProject.csproj" -c ${BUILD_CONFIGURATION} -o /bin
我尝试使用 linux alpine 基本映像来完成您的示例,但对我来说,它在控制台中打印运行时的变量
docker build .
这是 Dockerfile:
FROM alpine
#Copy source code into container
WORKDIR /src
COPY . .
#Build application
ARG BUILD_CONFIGURATION=Release
RUN dotnet build "MyProject/MyProject.csproj" -c ${BUILD_CONFIGURATION} -o /bin
这是输出:
....
=> [2/4] WORKDIR /src 0.1s
=> [3/4] COPY . . 0.3s
=> ERROR [4/4] RUN dotnet build "MyProject/MyProject.csproj" -c Release -o /bin 0.3s
------
> [4/4] RUN dotnet build "MyProject/MyProject.csproj" -c Release -o /bin:
0.323 /bin/sh: dotnet: not found
...
虽然输出错误,但至少它打印了
Release
作为日志的一部分,这证明它适用于linux基础映像...
由于您使用的是基于 Windows 的基础映像,因此使用
%%
而不是 $
符号来评估环境变量。因此,您可以修改运行命令以使其正常工作:
dotnet build "MyProject/MyProject.csproj" -c %BUILD_CONFIGURATION% -o /bin