繁体   English   中英

Docker 多级构建未将 arguments 传递到第二级

[英]Docker multistage build doesn't pass arguments to second stage

我有包含 2 个阶段的dockerbuild文件

ARG DOTNET_VERSION=net48
ARG CONFIGURATION=Release
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build-env
ARG DOTNET_VERSION
ARG CONFIGURATION

RUN echo .Net version: $env:DOTNET_VERSION

FROM mcr.microsoft.com/windows/nanoserver:1809
ARG DOTNET_VERSION

RUN echo .Net version: $env:DOTNET_VERSION

我使用下一个命令启动它: docker build -t test. --build-arg DOTNET_VERSION=net471 --no-cache docker build -t test. --build-arg DOTNET_VERSION=net471 --no-cache

Output 是:

Step 1/9 : ARG DOTNET_VERSION=net48
Step 2/9 : ARG CONFIGURATION=Release
Step 3/9 : FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build-env
 ---> c1e2ba0a9132
Step 4/9 : ARG DOTNET_VERSION
 ---> Running in 35ac4620bae3
Removing intermediate container 35ac4620bae3
 ---> 2000301c9b49
Step 5/9 : ARG CONFIGURATION
 ---> Running in 06b7c39a01b2
Removing intermediate container 06b7c39a01b2
 ---> 1591528894c8
Step 6/9 : RUN echo .Net version: $env:DOTNET_VERSION
 ---> Running in 6692bbe08eae
.Net
version:
net471
Removing intermediate container 6692bbe08eae
 ---> 7c4fa49a7732
Step 7/9 : FROM mcr.microsoft.com/windows/nanoserver:1809
 ---> 8572826a0d1a
Step 8/9 : ARG DOTNET_VERSION
 ---> Running in 3a1d9f759aaa
Removing intermediate container 3a1d9f759aaa
 ---> 74a6ccf7960f
Step 9/9 : RUN echo .Net version: $env:DOTNET_VERSION
 ---> Running in 13122b910b39
.Net version: $env:DOTNET_VERSION
Removing intermediate container 13122b910b39
 ---> 1c5b754b0b56
Successfully built 1c5b754b0b56

为什么第 6 步和第 9 步的结果不同?

这看起来可能是一个错误。

当您有一个与现有环境变量同名的构建 arg 时,Docker 将使用已设置的环境变量而不是构建 arg。

您使用的框架映像已经有一个名为 DOTNET_VERSION 的环境变量,因此您无法访问构建 arg 值。

解决方案是将您的构建命名为 arguments 其他名称。 我在这里添加了一个后缀 _ARG

ARG DOTNET_VERSION_ARG=net48
ARG CONFIGURATION=Release
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build-env
ARG DOTNET_VERSION_ARG
ARG CONFIGURATION

RUN echo .Net version: $env:DOTNET_VERSION_ARG

FROM mcr.microsoft.com/windows/nanoserver:1809
ARG DOTNET_VERSION_ARG

RUN echo .Net version: $env:DOTNET_VERSION_ARG

我的实验是在 Linux 上我使用这个 Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0
ARG DOTNET_VERSION=no-arg
ARG DOTNET_VERSION_ARG=arg
RUN echo DOTNET_VERSION=$DOTNET_VERSION - DOTNET_VERSION_ARG=$DOTNET_VERSION_ARG
ENV DOTNET_VERSION=$DOTNET_VERSION_ARG
RUN echo DOTNET_VERSION=$DOTNET_VERSION

得到了这个 output

DOTNET_VERSION=6.0.1 - DOTNET_VERSION_ARG=arg
DOTNET_VERSION=arg

因此,如果您有 ENV 语句,则可以将环境变量设置为构建参数中的值。

我发现了问题

如果使用mcr.microsoft.com/windows/nanoserver:1809图像,则应以 %arg% 格式使用 arguments。

如果使用mcr.microsoft.com/dotnet/framework/sdk:4.8图像,则 arguments 应以 $env:arg 格式使用。

这令人困惑,我还没有找到它的记录位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM