Dockerfilestring插值行为

我目前正在使用docker for windows,并试图找出如何在我的dockerfile的部分内进行string插值。

例如,下面是一个相当复杂的dockerfile,它似乎在整个商店中embedded了ARGENVvariables:

https://github.com/Microsoft/docker/blob/master/Dockerfile

所以如果你看第40行

 # allow replacing httpredir mirror ARG APT_MIRROR=httpredir.debian.org RUN sed -is/httpredir.debian.org/$APT_MIRROR/g /etc/apt/sources.list 

甚至是第106行

 # Configure the container for OSX cross compilation ENV OSX_SDK MacOSX10.11.sdk ENV OSX_CROSS_COMMIT 8aa9b71a394905e6c5f4b59e2b97b87a004658a4 RUN set -x \ && export OSXCROSS_PATH="/osxcross" \ && git clone https://github.com/tpoechtrager/osxcross.git $OSXCROSS_PATH \ && ( cd $OSXCROSS_PATH && git checkout -q $OSX_CROSS_COMMIT) \ && curl -sSL https://s3.dockerproject.org/darwin/v2/${OSX_SDK}.tar.xz -o "${OSXCROSS_PATH}/tarballs/${OSX_SDK}.tar.xz" \ && UNATTENDED=yes OSX_VERSION_MIN=10.6 ${OSXCROSS_PATH}/build.sh ENV PATH /osxcross/target/bin:$PATH 

你会看到他们正在把这些env / argvariables放到$MyVarName${MyVarName}各种RUN命令中,我假设它们必须为它们工作。 但是,如果我尝试做这样的事情,它会炸毁我,我很难find关于这一切应该如何工作,以及如果这可能是一个问题,我在docker运行在Windows(实际上使用基于Windows的容器)在Linux中使用docker。

所以这里有一个例子:

 FROM some/image ENV Version 0.1.0 RUN curl -L -oc:/some-output-dir http://some-url/downloads/file-$Version.zip 

我也尝试使用${Version} ,这似乎不工作,所以任何人都可以指向我一个简洁的“这里是如何做string插值dockerfiles”或快速上学我在这里出了什么问题,为什么它似乎不正确地解决variables,因为我知道有一个文件在http://some-url/downloads/file-0.1.0.zip

我也尝试使用数组符号样式运行,即RUN ["curl", "-L", ...]但似乎没有改变任何东西,但我的例子似乎是非常符合其他docker文件是如何,和他们的工作…我甚至尝试使用$(Version)但似乎也没有工作。

因为事实certificate,在Docker世界和容器世界中运行的内容是有区别的,而容器世界是我感到困惑的地方。

所以当你看到${someVar}$someVar基本上是一个unix的东西,所以这是正确的,在Unix世界中工作正常,但在Windows世界看来cmd / powershell不明白这一点,只是将其视为文字。

所以在windows的世界中,当你想要在你的cmd / powershell中embedded环境variables的时候,你需要使用%someVar% ,它会工作。