我正在运行一个Dockerfile
,但是,当我分配一个用于修改的变量时遇到问题/etc/fail2ban/jail.local
,其字符串内容为“PRIVATEIP”。
Dockerfile
产生错误并停止。因为我不知道分配一个变量sed
来修改特定文件中的字符串内容。
RUN IP=$(cat /root/ip_variable) | sed -i -r "s/PRIVATEIP/${IP}/g" /etc/fail2ban/jail.local
---> Running in 1e78ef4318ab
如果有任何替代方法可以处理此问题,请告诉我。
==================================================== ==========================
在 2018/7 月 11 日为以下替代方法添加更多说明:
我在 Dockerfile 上添加了一些命令行。目的和以前一样。我也可以使用 echo 编写如下脚本。但是,这很奇怪。为什么“sed”这个命令的“s”之后的同伴字符“/”会被遗漏?(如果有什么方法可以在代码输出中的字符上添加高光或标记,我感谢你。)如果这个问题解决了,我想我可以关闭这个问题。
Step 64/73 : RUN echo "#!/bin/bash\nexport PRIVATEIP=$(cat /home/ip_variable)\nsed -i -r \"s/\bPRIVATEIP\b/\${PRIVATEIP}/g\" /etc/fail2ban/jail.local\nsed -i -r \"s/\bPRIVATEIP\b/\${PRIVATEIP}/g\" /etc/opendkim/TrustedHosts" > /home/start_script.sh
---> Running in bbff59f82475
Removing intermediate container bbff59f82475
---> 0068d9d600ff
Step 65/73 : RUN cat /home/ip_variable
---> Running in faeb4bb1a6ba
172.17.0.2/16
Removing intermediate container faeb4bb1a6ba
---> f6cc35fd01e5
Step 66/73 : RUN cat /home/start_script.sh
---> Running in 95a5ef3b7d23
#!/bin/bash
export PRIVATEIP=172.17.0.2/16
sed -i -r "sPRIVATEI/${PRIVATEIP}/g" /etc/fail2ban/jail.local
sed -i -r "sPRIVATEI/${PRIVATEIP}/g" /etc/opendkim/TrustedHosts
Removing intermediate container 95a5ef3b7d23
---> 6720e7c01efc
Step 67/73 : RUN chmod 755 /home/start_script.sh
---> Running in d8ab5e04a846
Removing intermediate container d8ab5e04a846
---> decb9e147db9
Step 68/73 : RUN sh /home/start_script.sh
---> Running in fc86000f9a2f
sed: -e expression #1, char 28: unknown option to `s'
sed: -e expression #1, char 28: unknown option to `s'
The command '/bin/sh -c sh /home/start_script.sh' returned a non-zero code: 1
这对我有用:
使用 ipconf 和 ipaddr
然后:
但是,这正是我不会这样做的方式。更好的方法是使用构建参数:
然后:
但是我什至不确定这是正确的解决方案。我会:
COPY
. 这可以完全控制其内容。CMD
orENTRYPOINT
可以是在调用主命令之前修补文件的脚本。您还可以将配置文件作为 VOLUME 传递(如果 CMD 作为应用程序用户运行并且修补配置需要 root 权限,这可以避免问题)。谢谢大家。我的问题在于分隔符。我将“/”更改为“:”并让它工作。我在这里发布结果。在“Step 65/78”中,我打印了脚本内容,“Step 67/78”很好地运行了脚本。感谢@xenoid 和@Kusalananda。
分配不会产生输出,因此将其通过管道传输到另一个进程是没有意义的。
相反,使用
;
将管道划分为两个顺序命令:我不熟悉 Docker 和它的
RUN
命令。如果它只需要一个命令,那么使用或者