简体   繁体   English

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

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

I have dockerbuild file that contains from 2 stages我有包含 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

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

Output is: 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

Why step 6 and step 9 results are different?为什么第 6 步和第 9 步的结果不同?

This looks like it might be a bug.这看起来可能是一个错误。

When you have a build arg with the same name as an already existing environment variable, Docker will use the already set environment variable instead of the build arg.当您有一个与现有环境变量同名的构建 arg 时,Docker 将使用已设置的环境变量而不是构建 arg。

The framework image you use already has an environment variable called DOTNET_VERSION, so you can't access the build arg value.您使用的框架映像已经有一个名为 DOTNET_VERSION 的环境变量,因此您无法访问构建 arg 值。

The solution is to name your build arguments something else.解决方案是将您的构建命名为 arguments 其他名称。 I've added a suffix _ARG here我在这里添加了一个后缀 _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

My experiments were on Linux where I used this Dockerfile我的实验是在 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

and got this output得到了这个 output

DOTNET_VERSION=6.0.1 - DOTNET_VERSION_ARG=arg
DOTNET_VERSION=arg

So if you have an ENV statement, you can set the environment variable to the value from the build argument.因此,如果您有 ENV 语句,则可以将环境变量设置为构建参数中的值。

I found the problem我发现了问题

If mcr.microsoft.com/windows/nanoserver:1809 image is used then arguments should be used in %arg% format.如果使用mcr.microsoft.com/windows/nanoserver:1809图像,则应以 %arg% 格式使用 arguments。

If mcr.microsoft.com/dotnet/framework/sdk:4.8 image is used then arguments should be used in $env:arg format.如果使用mcr.microsoft.com/dotnet/framework/sdk:4.8图像,则 arguments 应以 $env:arg 格式使用。

It is confusing and I haven't found where it is documented.这令人困惑,我还没有找到它的记录位置。

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

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