Dockerfile 字符串插值行为

Dockerfile string interpolation behaviour

我目前正在为 windows 使用 docker,并且正在尝试找出如何在我的 docker 文件的部分内容中进行字符串插值。

例如,这是一个非常复杂的 docker 文件,它似乎在整个商店中嵌入了 ARGENV 变量:

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

所以如果你看看 line 40

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

甚至line 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

您会看到他们通过 $MyVarName${MyVarName} 将那些 env/arg 变量放入各种 RUN 命令中,我认为这对他们来说一定有效。但是,如果我尝试做这样的事情,我就会大吃一惊,我正在努力寻找有关这一切应该如何工作的大量信息,以及这是否可能是我的问题 运行 docker在 windows 中(实际上也使用基于 windows 的容器)与在 linux.

中使用 docker

所以这是我的例子:

FROM some/image

ENV Version 0.1.0

RUN curl -L -o c:/some-output-dir http://some-url/downloads/file-$Version.zip

我也尝试过使用 ${Version} 似乎也不太好用,所以任何人都可以给我指出一个简洁的 "here is how you do string interpolation in dockerfiles" 或者快速告诉我这里出了什么问题以及为什么会这样似乎没有正确解析变量,因为我知道 http://some-url/downloads/file-0.1.0.zip.

处有一个文件

我也尝试过使用数组符号样式 运行 即 RUN ["curl", "-L", ...] 但这似乎没有改变任何东西,但我的示例似乎与其他 docker文件是,它们可以工作...我什至尝试过使用 $(Version) 但这似乎也不起作用。

以防其他人遇到这个问题并且有点困惑,因为事实证明 Docker 世界和 Container 世界中的 运行 是有区别的,这就是我有点糊涂了。

所以当你看到 ${someVar}$someVar 基本上是 unix 的东西时,这是正确的并且在 Unix 世界中工作正常,但在 windows 世界中似乎cmd/powershell 不理解这个,只是把它当作字面意思。

所以在 windows 的世界里,当你想在你的 cmd/powershell 东西中嵌入环境变量时,你需要使用 %someVar% 它会起作用。