我正在创建一个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
,...)并做出适当的反应。
答案 0 :(得分:2)
用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
,从而直接发送信号。
答案 1 :(得分:2)
如果要在启动时执行复杂的操作,通常比尝试构建非常复杂的命令行要容易得多。一旦这样做,就可以使用the POSIX shell standard中可用的一组原语,即使它们需要多个命令来执行GNU bash可以内联的操作。
为此,我可以编写一个脚本:
ImportRange
然后将其复制为图像运行的默认内容
#!/bin/sh
ls -l >/ls-l.txt
exec java -jar /app/app.jar /ls-l.txt