首页 > 解决方案 > 如何在 Dockerfile 的 CMD 中使用 bash-only 语法?

问题描述

我正在创建一个Dockerfile启动 Java 应用程序的程序。这个 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,...)并做出适当的反应。

标签: bashdockerdockerfile

解决方案


将您的命令替换为 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,因此直接发送信号。


推荐阅读