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

k5ifujac  于 2023-03-29  发布在  Docker
关注(0)|答案(1)|浏览(106)

此问题在此处已有答案

command substitution in docker CMD(1个答案)
1年前关闭。
截至6天前,社区正在审查是否重新讨论这个问题。
有一个用于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' ',')"]

不幸的是,$(...)中的表达式在容器启动时没有被计算,应用程序抛出了一个异常,清楚地表明了这个问题:

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

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

3pmvbmvn

3pmvbmvn1#

要在entrypoint中使用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表达式。

相关问题