我有一个包含sed
命令的Dockerfile。我想动态更改使用sed
在ENV
中替换的值。但是,我不确定如何执行此操作,或者甚至是否可能。
我已经尝试过在引号内直接使用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
命令中?
答案 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中找到问题的原因,所以我当前的解决方法是使用导出的sed
在ENTRYPOINT
shell脚本中运行ENV
命令在Dockerfile中。