繁体   English   中英

如何在Dockerfile中的CMD中使用仅bash语法?

[英]How can I use bash-only syntax in CMD in a Dockerfile?

我正在创建一个启动Java应用程序的Dockerfile 给该Java应用程序一个文件路径,该文件路径包含ls -l的输出。

(请注意,在我真正的Dockerfile我不是在执行ls - l而是执行复杂的命令。为了简化问题,我将其更改为ls - l 。)

我尝试了以下方法:

FROM openjdk:8-jre

ARG JAR
COPY target/$JAR /app/app.jar

CMD java -jar /app/app.jar <( ls -l )

bash <( ... )构造应创建一个包含ls -l输出的临时文件。

启动Docker文件时,我得到:

/bin/sh: 1: Syntax error: "(" unexpected

现在, sh不支持<( ... )构造,因此会出现错误。 如何通过bash而不是sh安全地启动应用程序? 安全地说,我的意思是Java应用程序仍将接收所有操作系统信号( SIGHUP ,...)并做出适当的反应。

将命令替换为JSON列表,该列表的前两个元素是bash -c ,最后一个元素是您实际要运行的shell命令。

CMD ["bash", "-c", "exec java -jar /app/app.jar <( ls -l )"]

为了为更复杂的命令生成这样的数组,您可以考虑使用jq来确保语法正确,即使对于带有反斜杠,换行符或引号的输入也是如此:

jq -cnRs '["bash", "-c", input]' <<'EOF'
# you can put other shell commands here if you need to
exec java -jar /app/app.jar <( ls -l )
EOF

exec确保java实例替换bash ,并因此直接发送信号。

如果您要在启动时执行复杂的操作,将它们写到脚本中通常比尝试构建非常复杂的命令行要容易得多。 一旦这样做,就可以使用POSIX shell标准中可用的原语集,即使它们需要多个命令来执行GNU bash可以内联的操作。

为此,我可以编写一个脚本:

#!/bin/sh
ls -l >/ls-l.txt
exec java -jar /app/app.jar /ls-l.txt

然后将其复制为图像运行时的​​默认设置

FROM openjdk:8-jre
ARG JAR
COPY target/$JAR /app/app.jar
COPY launch-app.sh /usr/bin/app
# RUN chmod +x /usr/bin/app, if it's not already executable
CMD ["app"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM