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

use*_*545 15 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
Run Code Online (Sandbox Code Playgroud)

但是在构建时:

--build-arg http_proxy=http://myproxy","--build-arg a-version=a","--build-arg b-version=b"
Run Code Online (Sandbox Code Playgroud)

Step 10/15 : RUN wget...被示为具有$a-version在路径中而不是取代的值和生成失败.

我已按照此处显示的说明操作,但必须遗漏其他内容.

我的问题是,什么可能导致这个问题,我该如何解决?

Jus*_*ard 16

我在为 Windows 使用 Windows 容器时遇到了同样的问题。

而不是这样做(在linux容器中工作)

FROM alpine
ARG TARGETPLATFORM
RUN echo "I'm building for $TARGETPLATFORM"
Run Code Online (Sandbox Code Playgroud)

你需要这样做

FROM mcr.microsoft.com/windows/servercore
ARG TARGETPLATFORM
RUN echo "I'm building for %TARGETPLATFORM%"
Run Code Online (Sandbox Code Playgroud)

只需根据操作系统更改可变分辨率即可。

  • 这也是我使用 Docker 19.0.3 和 Windows 10 v1809 的解决方案。我认为 Docker 文档中没有提到这一点。 (2认同)

小智 15

要注意的另一件事是,在所有FROM语句之后,所有ARGs 都将被收集并且不再可用。多阶段构建时要小心。

  • 一定喜欢 docker 文件的随机性。当然ARGS会在...之后消失...当然... (37认同)
  • 我的天啊。很高兴我在向下滚动后找到了你的帖子! (5认同)
  • 我认为您可以通过将 ARG 复制到 ENV 中来解决此问题。```ARG OSVERSION ENV OSVERSION=${OSVERSION:10}``` (3认同)
  • 真棒!我只有一个小时的时间来找出为什么它无法在我的机器上运行 (2认同)

Rob*_*ert 14

不要-在变量名中使用.

Docker构建将始终显示Dockerfile中记录的行,尽管变量值.

所以使用这个变量名a_version:

ARG a_version
Run Code Online (Sandbox Code Playgroud)

看这个例子:

Dockerfile:

FROM alpine

ARG a_version
RUN echo $a_version
Run Code Online (Sandbox Code Playgroud)

建立:

$ 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
Run Code Online (Sandbox Code Playgroud)


Ole*_*leg 10

我花了很多时间让参数替换工作,但解决方案非常简单。内部的替换RUN需要将参数引用括在双引号中。

ARG CONFIGURATION=Debug
RUN dotnet publish "Project.csproj" -c "$CONFIGURATION" -o /app/publish
Run Code Online (Sandbox Code Playgroud)


nbr*_*osz 8

我能够代替在Windows集装箱的ARG的唯一方法是用前缀$env:,提到这里

我的 Dockerfile 的一个例子如下。请注意,ARG PATFROM之后定义的因此它在RUN nuget sources add命令中的使用范围内(如洪涛建议的那样)。我发现提供个人访问令牌的唯一成功方法是使用$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/. ./
Run Code Online (Sandbox Code Playgroud)

实际的 Docker 命令如下所示:

docker build --build-arg PAT=mypatgoeshere -t webapi .