在我的Dockerfile中,我有以下内容:
ARG a-version
RUN wget -q -O /tmp/alle.tar.gz http://someserver/server/$a-version/a-server-$a-version.tar.gz && \
mkdir /opt/apps/$a-version
然而,在构建时:
--build-arg http_proxy=http://myproxy","--build-arg a-version=a","--build-arg b-version=b"
Step 10/15 : RUN wget...
在路径中显示$a-version
而不是替换值,构建失败。
我已按照here显示的说明操作,但必须遗漏其他内容。
我的问题是,可能导致此问题的原因以及如何解决 它?
答案 0 :(得分:12)
不要在变量名中使用-
。
Docker构建将始终显示Dockerfile中记录的行,尽管变量值。
因此请使用此变量名称a_version
:
ARG a_version
见这个例子:
Dockerfile:
FROM alpine
ARG a_version
RUN echo $a_version
构建
$ docker build . --build-arg a_version=1234
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM alpine
---> a41a7446062d
Step 2/3 : ARG a_version
---> Running in c55e98cab494
---> 53dedab7de75
Removing intermediate container c55e98cab494
Step 3/3 : RUN echo $a_version <<< note this <<
---> Running in 56b8aeddf77b
1234 <<<< and this <<
---> 89badadc1ccf
Removing intermediate container 56b8aeddf77b
Successfully built 89badadc1ccf
答案 1 :(得分:4)
要注意的另一件事是,在每条FROM
语句之后,所有ARG
都将被收集并且不再可用。多阶段构建时要小心。
答案 2 :(得分:2)
我花了很多时间使参数替换起作用,但是解决方案确实很简单。 RUN
中的替换需要将参数引用用双引号引起来。
ARG CONFIGURATION=Debug
RUN dotnet publish "Tmp.AtsCandidates.AtsImportApi.csproj" -c "$CONFIGURATION" -o /app/publish
答案 3 :(得分:2)
我能够在Windows容器中替换ARG的唯一方法是在$env:
前面加上here。
下面是我的Dockerfile的示例。请注意,ARG PAT
是在FROM之前定义的,因此在RUN nuget sources add
命令(as Hongtao suggested)中的使用范围内。我发现提供个人访问令牌的唯一成功方法是使用$env:PAT
FROM mcr.microsoft.com/dotnet/framework/sdk:4.7.2 AS build
WORKDIR /app
ARG PAT
# copy csproj and restore as distinct layers
COPY *.sln .
COPY WebApi/*.csproj ./WebApi/
COPY WebApi/*.config ./WebApi/
RUN nuget sources add -name AppDev -source https://mysource.pkgs.visualstudio.com/_packaging/AppDev/nuget/v2 -username usern -password $env:PAT
RUN nuget restore
# copy everything else and build app
COPY WebApi/. ./WebApi/
WORKDIR /app/WebApi
RUN msbuild /p:Configuration=Release
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2 AS runtime
WORKDIR /inetpub/wwwroot
COPY --from=build /app/WebApi/. ./
实际的Docker命令如下所示:
docker build --build-arg PAT=mypatgoeshere -t webapi .
答案 4 :(得分:0)
在Windows上使用Docker时,我遇到了同样的问题。
而不是这样做(在Linux容器中有效)
FROM alpine
ARG TARGETPLATFORM
RUN echo "I'm building for $TARGETPLATFORM"
您需要这样做
FROM mcr.microsoft.com/windows/servercore
ARG TARGETPLATFORM
RUN echo "I'm building for %TARGETPLATFORM%"
只需根据操作系统更改可变分辨率即可。
答案 5 :(得分:0)
对我来说,这是论据的命令:
docker build . -f somepath/to/Dockerfile --build-arg FOO=BAR
不起作用,但是:
docker build --build-arg FOO=BAR . -f somepath/to/Dockerfile
没有。