Docker中RUN echo命令的参数

64
作为Dockerfile的一部分,我正在尝试修改一个文本文件(ssh_config),以包含用户在构建时通过docker容器传递的变量(作为ARG)。
我的Dockerfile如下(这不是整个文件):
ARG key_name
RUN echo 'Host geoserver\n\
User user\n\
HostName 38.191.191.111\n\
IdentityFile /root/$key_name' >> /etc/ssh/ssh_config

这里收集了参数 key_name,然后将一些文本添加到 ssh_config 文本文件中。

运行方式如下:

docker build --build-arg key_name=GC -t pyramid .

当我检查所写的内容时,key_name变量未被解析,而是作为文本(因此文字上显示为$key_name)被写入。显然,我希望它被替换为通过ARG传递的变量。
我尝试使用${key_file}而不是$key_file,但我只得到相同的文本文件,其中包括花括号。
因此,我的问题是,在RUN echo语句中如何正确使用ARG变量?

谢谢,我会把这个加到我的问题里。 - Single Entity
你的 ARG 在哪里?在 FROM 的内部还是外部?(是的,这很重要)。此外,请尝试从你的 echo 中删除 ' - Munchkin
除了“FROM”之外,我认为没有缩进。 FROM是我的Dockerfile中的第一行,但是从那里没有缩进。 ARG正常工作,因为它也用于命名复制到容器中的文件,因此我已确认ARG被正确填充,我认为问题在于echo部分。但是删除'确实起作用。 - Single Entity
所以从echo中删除'是有效的,但现在我失去了我的格式,现在如何使用新行,有什么想法吗? - Single Entity
https://dev59.com/GGw15IYBdhLWcg3wWqZ0 - Munchkin
显示剩余2条评论
2个回答

64

3
在我的情况下,它是在FROM之前的ARG。谢谢! - ybonda
不,它只是字面上接受 echo "$VARIABLE" 并显示 RUN echo "$VARIABLE" ¯_(ツ)_/¯。 - Nathan McKaskle

15

当您使用单引号将变量括起来时,它不会被替换。

如果您需要在文件中使用单引号,只需用双引号将所有内容括起来,否则可以完全删除单引号。

ARG key_name
RUN echo "'Host geoserver\n\
User user\n\
HostName 38.191.191.111\n\
IdentityFile /root/$key_name'" >> /etc/ssh/ssh_config

1
不是答案。仍然只是字面理解。 - Nathan McKaskle
如果你把单引号移到$key_name之前会怎样? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接