bash - 如何在 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
,...)并做出适当的反应。
解决方案
将您的命令替换为 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
,因此直接发送信号。
推荐阅读
- python - SageMaker 端点无法加载拥抱脸标记器
- p2p - 在 P2P 网络中使用 dht 可以代替信令服务器的使用吗?
- kubernetes - 启动后复制 pod 文件系统中的文件
- memory - 完成 lambda 函数后,存储在 redis 上的 AWS lambda 数据是否仍然存在?
- swift - 如何解码带有嵌套数组的字典?
- android - Async 和 RecyclerView 在获取数据时显示列表
- python - 如何使用 Python 处理多页 PDF OCR 中的临时文件?
- reactjs - Reactjs axios多次发送请求
- go - 转到模板:如何将数组 [] 字符串打印到
- html - 为什么我的两个 SVG 在 React 中加载为同一个?