【问题标题】:How to execute bash expression in Docker ENTRYPOINT? [duplicate]如何在 Docker ENTRYPOINT 中执行 bash 表达式? [复制]
【发布时间】:2021-06-04 05:49:32
【问题描述】:

有一个用于 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 docker configuration-files docker-entrypoint


    【解决方案1】:

    要在入口点使用 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 表达式。

    【讨论】:

    • 请注意,非 JSON 数组形式通过将其字符串包装在 /bin/sh -c 中来工作,因此此答案与原始问题之间的唯一实际区别是明确选择 bash 作为 shell。
    • 说得好,@DavidMaze。您介意我将其添加到答案中吗?
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多