将命令行参数传递给在 Docker 中运行的 Java 应用程序(Spring Boot)

Posted

技术标签:

【中文标题】将命令行参数传递给在 Docker 中运行的 Java 应用程序(Spring Boot)【英文标题】:Pass command line args to Java app (Spring Boot) running in Docker 【发布时间】:2019-06-23 02:15:38 【问题描述】:

我正在尝试将命令行参数传递给在 Docker 容器中运行的 Spring Boot 应用程序的主要方法。从命令行运行,我会做这样的事情:

 $ mvn spring-boot:run -Dspring-boot.run.arguments=--greeting=Hello,--recipient=World

应用程序需要提取这些参数并对其进行一些处理:

public static void main(String[] args) 
    Options options = new Options();

    Option greeting = new Option("-g", "greeting", true, "Greeting");
    greeting.setRequired(true);
    greeting.addOption(greeting);

    Option recipient = new Option("-r", "recipient", true, "Recipient");
    recipient.setRequired(true); 
    recipient.addOption(recipient);

    try 
        cmd = parser.parse(options, args);
     catch (ParseException e) 
        System.out.println(e.getMessage());
        formatter.printHelp("utility-name", options);
        System.exit(1);
    

    // Do some processing using these args ...

    // Run the Spring Boot app
    SpringApplication.run(SpringBootApp.class, args);

我尝试使用 -e 标志简单地传递它们:

docker run -p 8080:8080 -d -e "greeting=Hello" -e "recipient=World" test-image

我的Dockerfile 看起来像这样:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY ./target/spring-boot-app-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

由于需要选项(args),我不断收到错误消息并且应用退出。

【问题讨论】:

【参考方案1】:

您可以在 run 命令中的 docker 映像名称之后提供所有命令行参数。

示例:

docker run -p 8080:8080 test-image --recipient="World"--greeting="Hello"

【讨论】:

太棒了。在试图弄清楚这一点时,我没有看到任何类似以这种方式启动容器的东西。谢谢@Evgeniy Strepetov 请注意:传递系统参数只有在你有 exec 表单入口点时才有效(例如:["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"])。详细描述here【参考方案2】:

您可以尝试像这样在Dockerfile 中修改您的ENTRYPOINT

ENTRYPOINT exec java -jar -Dspring-boot.run.arguments=--greeting=Hello,--recipient=World

或者你可以在运行时传递参数:

docker run -p 8080:8080 test-image --recipient="World"--greeting="Hello"

【讨论】:

我尝试了与 ENTRYPOINT 类似的东西,但语法有点古怪,但这完全有道理。谢谢@veben 为 Dockerfile 中 ENTRYPOINT 行中的参数设置固定值对我来说没有意义。

以上是关于将命令行参数传递给在 Docker 中运行的 Java 应用程序(Spring Boot)的主要内容,如果未能解决你的问题,请参考以下文章

将命令行参数传递给 QPython

如何将命令行参数传递给 WinForms 应用程序?

如何将命令行参数传递给 unix/linux 系统上正在运行的进程?

将命令行参数传递给 AWS Fargate 容器

将命令行参数传递给python脚本[重复]

如何将命令行参数传递给 Node.js 程序?