Dockerfile-如何在引用的RUN命令中使用ENV



我有一个Dockerfile,其中包含一个sed命令。我想使用ENVs动态更改sed中正在替换的值。然而,我真的不确定如何做到这一点,也不确定这是否可能。

我试过直接在引号中使用ENV键,比如:

RUN sed -i "s|urlVal: ${OLD_URL}|urlVal: ${NEW_URL}|" ./example.txt

但它从字面上读取值。我曾考虑将sed字符串与ENVs连接起来,但我不确定如何做到这一点,而且在文档中找不到任何关于它的信息

假设我的Dockerfile看起来像下面的例子:

FROM ubuntu
ENV OLD_URL=example.com
ENV NEW_URL=www.test.com
COPY . .
RUN sed -i "s|urlVal: example.com|urlVal: www.test.com|" ./example.txt

是否可以直接将ENV值注入sed命令

它对我来说是扩展的,所以我怀疑问题出在你的文件内容本身,或者你是如何运行容器的:

$ cat df.env5
FROM ubuntu
ENV OLD_URL=example.com
ENV NEW_URL=www.test.com
RUN echo "urlVal: example.com" >/example.txt
RUN sed -i "s|urlVal: ${OLD_URL}|urlVal: ${NEW_URL}|" /example.txt
CMD cat /example.txt
$ docker build -t test-env5 -f df.env5 .
Sending build context to Docker daemon  30.72kB
Step 1/6 : FROM ubuntu
---> 775349758637
Step 2/6 : ENV OLD_URL=example.com
---> Using cache
---> edcd532bebba
Step 3/6 : ENV NEW_URL=www.test.com
---> Using cache
---> 7d71251cf653
Step 4/6 : RUN echo "urlVal: example.com" >/example.txt
---> Using cache
---> 0ff55a14765f
Step 5/6 : RUN sed -i "s|urlVal: ${OLD_URL}|urlVal: ${NEW_URL}|" /example.txt
---> Running in dabae6fb8f63
Removing intermediate container dabae6fb8f63
---> c7515a76e73e
Step 6/6 : CMD cat /example.txt
---> Running in 69739fd8de24
Removing intermediate container 69739fd8de24
---> ecbf606a343d
Successfully built ecbf606a343d
Successfully tagged test-env5:latest
$ docker run -it --rm test-env5
urlVal: www.test.com

只需去掉花括号,直接使用:RUN sed -i "s|urlVal: $OLD_URL|urlVal: $NEW_URL|" ./example.txt

您可以想象该语句是在cmd行上运行的。

export thisVar=thisVar_value
echo $thisVar

输出:thisVar_value

使用该逻辑,删除花括号。

经过一些故障排除和@BMitch的建议,我发现Dockerfile存在一些问题。出于某种原因,我可以将shell附加到容器并运行相同的命令而不会出现任何问题,但在构建图像时(即使对值进行硬编码时(它也不会起任何作用

不幸的是,我无法在Dockerfile中找到问题的原因,因此我当前的解决方法是使用我在Dockerfle中导出的ENVENTRYPOINTshell脚本中运行sed命令。

相关内容

最新更新