运行命令中的ARG替换不适用于Dockerfile
在我的Dockerfile中,我有以下内容:运行命令中的ARG替换不适用于Dockerfile,docker,dockerfile,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
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"
步骤10/15:运行wget…
在路径中显示$a-version
,而不是替换值,生成失败
我已按照所示的说明进行操作,但肯定遗漏了其他内容
我的问题是,是什么导致了这个问题,我该如何解决
是吗
不要在变量名中使用
-
Docker build将始终显示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
$docker构建--生成参数a_版本=1234
正在将生成上下文发送到Docker守护程序2.048 kB
步骤1/3:从阿尔卑斯山
--->A41A744602D
步骤2/3:ARG a_版本
--->在c55e98cab494中运行
--->53dedab7de75
拆卸中间容器c55e98cab494
步骤3/3:运行echo$a_version我花了很多时间让参数替换工作,但解决方案非常简单。RUN
中的替换需要将参数引用括在双引号中
ARG CONFIGURATION=Debug
RUN dotnet publish "Project.csproj" -c "$CONFIGURATION" -o /app/publish
我在Windows中使用Windows容器时也遇到同样的问题
而不是这样做(在linux容器中工作)
你需要这样做
FROM mcr.microsoft.com/windows/servercore
ARG TARGETPLATFORM
RUN echo "I'm building for %TARGETPLATFORM%"
只需根据操作系统更改变量分辨率。另一件需要注意的事情是,在每个FROM
语句之后,所有ARG都会被收集,不再可用。多阶段构建时要小心
您可以重新使用ARG
,在中省略默认值以解决此问题:
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
摘自文档的示例:
我能够在Windows容器中替换ARG的唯一方法是使用前面提到的$env:
作为前缀
下面是我的Dockerfile的一个示例。请注意,ARG PAT
是在FROM之后定义的,因此它在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/. ./
实际的Docker命令如下所示:
docker build--build arg PAT=mypatgoesher-t webapi。
对我来说,这是参数的顺序:
docker构建-f somepath/to/Dockerfile——build arg FOO=BAR
不起作用,但:
docker build——build arg FOO=BAR-f somepath/to/Dockerfile
是的。我也遇到了这个问题。但是——似乎不是原因。我的参数名是privKeyFile,无论我尝试了什么,构建时的值始终为空。根据下面的@Oleg注释,尝试在变量周围添加引号(例如,“$privKeyFile”
)。这为我解决了同样的问题。奇怪的是,引号似乎只是Windows上的一项要求,因为在没有引号的MacOS上,一切都很好。真棒!我只有一个小时的时间来找出为什么我的机器无法工作我想你可以通过将ARG复制到ENV来解决这个问题<代码>ARG OSVERSION ENV OSVERSION=${OSVERSION:10}
天哪。很高兴我在向下滚动后找到了你的帖子!这也是我使用Docker 19.0.3和Windows 10 v1809的解决方案。我认为Docker文档中没有提到这一点。我尝试了其他建议,并引用了RUN powershell-Command Expand Archive“$NAME”.zip
等,但只有这样做有效<代码>运行powershell-命令展开存档%NAME%.zip这是我在Windows容器上唯一可以使用的东西。谢谢真是个救命恩人,我在Windows(运行Windows容器)上的变量替换上苦苦挣扎。这个答案是我找到这个信息的唯一地方。非常感谢。花了将近一天的时间试图找出whey ARG没有在windows映像上工作的原因。。。谢谢“%ARG\u NAME%”适用于windows映像。这可能与SHELL
声明中的差异有关吗?这是唯一对我有效的解决方案,我不清楚为什么。(FWIW,我的是SHELL[“powershell”,…]
)
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/. ./