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

时间:2019-11-12 14:33:40

标签: docker dockerfile

我有一个包含sed命令的Dockerfile。我想动态更改使用sedENV中替换的值。但是,我不确定如何执行此操作,或者甚至是否可能。

我已经尝试过在引号内直接使用ENV键,例如:

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

,但是它从字面上读取值。我当时正在考虑将sed字符串与ENV连接起来,但是我不确定该怎么做,而且我在文档中也找不到任何相关内容。

说我的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命令中?

3 个答案:

答案 0 :(得分:1)

它为我扩展了,所以我怀疑问题出在文件内容本身,或者您如何运行容器:

$ 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

答案 1 :(得分:0)

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

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

export thisVar=thisVar_value
echo $thisVar

输出:thisVar_value

并使用该逻辑,删除大括号。

答案 2 :(得分:0)

经过一些故障排除并按照@BMitch的建议,我发现Dockerfile存在一些问题。出于某种原因,我能够将外壳连接到容器并运行相同的命令而没有任何问题,但是在构建图像(即使对值进行硬编码)时,它也无能为力

不幸的是,我无法在Dockerfile中找到问题的原因,所以我当前的解决方法是使用导出的sedENTRYPOINT shell脚本中运行ENV命令在Dockerfile中。