RUN命令中的ARG替换不适用于Dockerfile

时间:2017-06-08 14:34:40

标签: docker dockerfile

在我的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显示的说明操作,但必须遗漏其他内容。

  

我的问题是,可能导致此问题的原因以及如何解决   它?

6 个答案:

答案 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

没有。