【问题标题】:Passing Command Line arguments to AWS Fargate Container将命令行参数传递给 AWS Fargate 容器
【发布时间】: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 容器中运行的应用程序指定命令行参数?

【问题讨论】:

    标签: spring-boot terraform amazon-ecs aws-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 一起传递完美
    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 2015-06-09
    • 2017-10-22
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多