[英]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.