如何在Docker入口点中执行bash表达式?

如何在Docker入口点中执行bash表达式?,bash,docker,configuration-files,docker-entrypoint,Bash,Docker,Configuration Files,Docker Entrypoint,SpringBoot应用程序有一个Docker文件,其入口点如下: # some lines omitted ENTRYPOINT java -jar app.jar --spring.config.additional-location=$(ls /config/*.properties | tr '\n' ',') 在容器启动时,主机目录被装载到/config/目录: docker run -p 9999:8080 -v C:/path/to/configuration/:/conf

SpringBoot应用程序有一个Docker文件,其入口点如下:

# some lines omitted

ENTRYPOINT java -jar app.jar --spring.config.additional-location=$(ls /config/*.properties | tr '\n' ',')
在容器启动时,主机目录被装载到
/config/
目录:

docker run  -p 9999:8080  -v C:/path/to/configuration/:/config   my_image_name
它可以按预期工作,从主机目录捕获所有
*.properties
,并将它们应用到应用程序

为了便于阅读,我希望在ENTRYPOINT中使用字符串数组格式,如下所示:

ENTRYPOINT ["java", "-jar", "app.jar", "--spring.config.additional-location=$(ls /config/*.properties | tr '\n' ',')"]
不幸的是,
$(…)
中的表达式在容器开始时没有计算,应用程序抛出一个异常,清楚地显示了问题:

[main] ERROR org.springframework.boot.SpringApplication - Application run failed
             java.lang.IllegalStateException: Unable to load config data from '')'

请帮助我了解如何表达ENTRYPOINT参数,以便可以像第一种情况一样计算
$()
中的bash表达式。

要在ENTRYPOINT中使用bash,您需要运行
bash
,而不是
java

ENTRYPOINT ["/bin/bash", "-c", "java -jar app.jar --spring.config.additional-location=$(ls /config/*.properties | tr '\n' ',')"]

入口点的第一个元素是要执行的二进制或脚本(即什么)。其余的(包括
CMD
)作为它的参数
bash-c“some string”
运行一系列以字符串形式传递的命令,并且可以在其中使用
bash
表达式。

请注意,非JSON数组形式的工作方式是将其字符串包装在
/bin/sh-c
中,因此,这个答案和原始问题之间唯一的实际区别是明确选择bash作为shell。你介意我在答案中加上这个吗?