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

Posted

技术标签:

【中文标题】将命令行参数传递给 AWS Fargate 容器【英文标题】:Passing Command Line arguments to AWS Fargate Container 【发布时间】:2020-11-02 03:25:21 【问题描述】:

我们正在使用 Terraform 动态启动 AWS ECS/Fargate 容器以运行 Spring Boot 应用程序,并且需要将多个命令行参数传递到应用程序中。可用的文档似乎表明执行此操作的正确方法是在 Terraform 容器定义 JSON 中定义一个“命令”块,并在那里指定一个或多个参数。这是我当前的容器定义:

 [
"name": "$environment-$app_name",
"image": "$app_image",
"cpu": $fargate_cpu,
"memory": $fargate_memory,
"networkMode": "awsvpc",
"command": [
   "--server.port",
   "$app_port"
],
"logConfiguration": 
    "logDriver": "awslogs",
    "options": 
      "awslogs-group": "$environment-$app_name",
      "awslogs-region": "$aws_region",
      "awslogs-stream-prefix": "ecs"
    
,
"portMappings": [
  
    "containerPort": $app_port,
    "hostPort": $app_port
  
]]

您会注意到我已经使用参数 --server.port 定义了 命令块,并将其值设置为 app_port 变量。然而,在部署时,容器内运行的 Spring Boot 应用程序不会获取此参数,而是使用默认端口。

我的问题很简单:应该如何为在 Fargate 容器中运行的应用程序指定命令行参数?

【问题讨论】:

【参考方案1】:

似乎是因为您正在传递系统属性的语法。 在推送云之前,您可以在本地系统上轻松测试它。

docker run -it --net host --rm sprintbootimage java -jar /data/hello-world-0.1.0.jar –server.port=8081

这不起作用,您可以阅读有关this的更多详细信息,要使其正常工作,您只需简单地通过-Dserver.port=8081即可

docker run -it --net host --rm hello-world java -jar -Dserver.port=8081 /data/hello-world-0.1.0.jar

输出

2020-07-13 03:31:59.316  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-07-13 03:31:59.631  INFO 1 --- [ main] : Tomcat started on port(s): 8081 (http) with context path ''
2020-07-13 03:31:59.636  INFO 1 --- [           main] c.d.hello.Application                    : Started Application in 4.031 seconds (JVM running for 4.875)

Why do JVM arguments start with "-D"?

-Dproperty=value

设置系统属性值。属性变量是一个不带空格的字符串,表示属性的名称。 value 变量是一个字符串,表示属性的值。如果 value 是带空格的字符串,则用引号将其括起来(例如 -Dfoo="foo bar")。

所以CMD 会变成

  
command: ["java", "-Dserver.port=$app_port", "-jar", "/data/hello-world-0.1.0.jar"] 

【讨论】:

感谢您的回复。所以我想澄清两件事:1)在我的 docker 文件中,我使用 ENTRYPOINT 命令启动应用程序,因此我的理解是我应该能够将启动应用程序所需的参数传递给 COMMAND 数组。 2)我很清楚有必要在 JVM 属性前加上“D”,但是 Spring Boot 提供了一种“速记”,基本上可以在以下名称/值对形式中指定属性:--property.name=价值。因此,在容器之外我可以执行以下操作: java -jar app.jar --server.port=80 是的,您可以将 cmd 转换为入口点,对于第二点,它在本地复制时也无法正常工作,因此与 D 一起传递完美

以上是关于将命令行参数传递给 AWS Fargate 容器的主要内容,如果未能解决你的问题,请参考以下文章

将 JVM 参数传递给 AWS Elastic Beanstalk 上的 Java 应用程序

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

在 Eclipse(Pydev) 中将命令行参数传递给 Python 脚本

将命令行参数传递给函数

如何将命令行参数传递给构建的 Mix Release

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