如何在Docker ENTRYPOINT 中执行bash 表达式?

How to execute bash expression in 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/:/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 表达式可以像第一种情况一样进行计算。

要在入口点使用 bash,您需要 运行 bash,而不是 java:

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

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