我们正在使用Terraform动态启动AWS ECS / Fargate容器以运行Spring Boot Application,并且需要将多个命令行参数传递给应用程序。可用的文档似乎建议正确的方法是在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容器中运行的应用程序指定命令行参数?
由于语法的原因,您似乎正在传递系统属性。在推送其云之前,您可以轻松地在本地系统上对其进行测试。
docker run -it --net host --rm sprintbootimage java -jar /data/hello-world-0.1.0.jar –server.port=8081
这将行不通,您可以阅读有关此内容的更多详细信息,以使其正常运行,只需通过-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)
-Dproperty=value
设置系统属性值。属性变量是一个没有空格的字符串,代表属性的名称。value变量是代表属性值的字符串。如果value是带空格的字符串,则将其括在引号中(例如
-Dfoo="foo bar"
)。
因此,CMD
将成为
command: ["java", "-Dserver.port=${app_port}", "-jar", "/data/hello-world-0.1.0.jar"]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句