Dockerfile RUN命令从字符串中省略以“ $”开头的字符

时间:2019-02-25 16:41:03

标签: docker dockerfile alpine

我正在尝试将以下字符串打印到文件中:

"hellow world $xHbbbbbbbb"  

我可以通过两种选择来做到这一点:

printf "hellow world \$xHbbbbbbbb\n" > /myfile1  
echo "hellow world \$xHbbbbbbbb\n" > /myfile2  

在终端上工作正常。
当我像这样用Dockerfile构建它时:

cat > Deleteme <<EOF
FROM alpine:latest
RUN printf "hellow world \$xHbbbbbbbb\n" > /myfile1
RUN echo "hellow world \$xHbbbbbbbb\n" > /myfile2
EOF

docker build -t deleteme -f Deleteme .  
docker run --rm -it deleteme sh -c "cat /myfile1 && cat /myfile2"  

输出为:

hellow world 
hellow world \n

为什么RUN命令省略了$xHbbbbbbbb
我之所以这样想,是因为$将其标识为变量,但是它在终端上对我有用,所以我不明白为什么它也不能在Dockerfile上工作。
如何将以下字符串写入文件:

"hellow world $xHbbbbbbbb"  

1 个答案:

答案 0 :(得分:1)

在Dockerfile中,$xHbbbbbbbb的确计算为环境变量
(有关用法和示例,请参见Docker Documentation | Environment replacement

要获得理想的结果,您需要同时退出\$
另外,在echo中,\n不会被解释为换行符,除非指定了-e选项,但是您似乎可以忽略它(请参见echo man page更多)。

将它们放在一起:

cat > Deleteme <<EOF
FROM alpine:latest
RUN printf "hellow world \\\$xHbbbbbbbb\n" > /myfile1
RUN echo "hellow world \\\$xHbbbbbbbb" > /myfile2
EOF

具有以下Deleteme文件的结果:

FROM alpine:latest
RUN printf "hellow world \$xHbbbbbbbb\n" > /myfile1
RUN echo "hellow world \$xHbbbbbbbb" > /myfile2

docker输出:

hellow world $xHbbbbbbbb
hellow world $xHbbbbbbbb