【问题标题】:How can run cmd in aws_ecs_task_definition terraform aws如何在 aws_ecs_task_definition terraform aws 中运行 cmd
【发布时间】:2022-11-02 00:48:56
【问题描述】:

我需要在 aws_ecs_task_definition 中运行 docker cmd 我可以直接在本地机器 docker 中运行它,但无法在 task_definition 上运行它

        docker run -it --rm \
    --name n8n \
    -p 5678:5678 \
    -e DB_TYPE=postgresdb \
    -e DB_POSTGRESDB_DATABASE=<POSTGRES_DATABASE> \
    -e DB_POSTGRESDB_HOST=<POSTGRES_HOST> \
    -e DB_POSTGRESDB_PORT=<POSTGRES_PORT> \
    -e DB_POSTGRESDB_USER=<POSTGRES_USER> \
    -e DB_POSTGRESDB_SCHEMA=<POSTGRES_SCHEMA> \
    -e DB_POSTGRESDB_PASSWORD=<POSTGRES_PASSWORD> \
    -v ~/.n8n:/home/node/.n8n \
    n8nio/n8n \
    n8n start

这就是我需要运行的 cmd,但可以在本地正常工作,但无法从 aws_ecs_task_definition

我试图从命令里面容器定义但无法运行

已编辑

resource "aws_ecs_task_definition" "task-definition" {
  family                = "${var.PROJECT_NAME}-task-definition"
  container_definitions = jsonencode([
    {
      name      = "${var.PROJECT_NAME}-task-container"
      image     = "${var.IMAGE_PATH}"
      cpu       = 10
      memory    = 512
      essential = true
      environment = [
        {name: "DB_TYPE", value: "postgresdb"},
        {name: "DB_POSTGRESDB_DATABASE", value: "${var.DB_NAME}"},
        {name: "DB_POSTGRESDB_HOST", value: "${var.DB_NAME}"},
        {name: "DB_POSTGRESDB_DATABASE", value: "${aws_db_instance.rds.address}"},
        {name: "DB_POSTGRESDB_PORT", value: "5432"},
        {name: "DB_POSTGRESDB_USER", value: "${var.DB_USERNAME}"},
        {name: "DB_POSTGRESDB_PASSWORD", value: "${var.DB_PASSWORD}"},
      ]
      
      command   = [
        "docker", "run", 
        "-it", "--rm", 
        "--name", "${var.IMAGE_PATH}",  
        "-v", "~/.n8n:/home/node/.n8n", 
        "n8nio/n8n", 
        "n8n", "start",
        "n8n", "restart"
      ]

      portMappings = [
        {
          containerPort = 5678
          hostPort      = 5678
        }
      ]
    }
  ])

  depends_on = [
    aws_db_instance.rds
  ]
}

resource "aws_ecs_service" "service" {
  name            = "${var.PROJECT_NAME}-ecs-service"
  cluster         = aws_ecs_cluster.ecs-cluster.id
  task_definition = aws_ecs_task_definition.task-definition.arn
  desired_count   = 1
  iam_role        = aws_iam_role.ecs-service-role.arn
  depends_on      = [aws_iam_policy_attachment.ecs-service-attach]

  load_balancer {
    elb_name       = aws_elb.elb.name
    container_name = "${var.PROJECT_NAME}-task-container"
    container_port = 5678
  }

  
}

【问题讨论】:

  • 抱歉,什么是“在 aws_ecs_task_definition 中运行命令”?您的意思是对 ECS 任务中正在运行的容器执行 exec 吗?
  • 您实际上是在要求某人给您代码。首先,阅读文档。有很多关于如何做到这一点的例子。然后,如果您遇到无法解决的错误,请转向 SO。
  • 是的,在 aws_ecs_task_definition 里面我有 container_definition 我试图通过这个,aws_ecs_task_definition 被 aws_ecs_service 使用
  • @MarkoE 在文档中说写在我已经尝试过的 commad 属性中,使用它给我 503 错误,我需要与数据库连接的数据的持久性,否则它对我有用
  • 您只显示了 Docker 命令,没有 terraform 代码。因此,如果没有它,几乎不可能说出可能出了什么问题。

标签: amazon-web-services terraform amazon-ecs ecs-taskdefinition n8n


【解决方案1】:

ECS 任务定义中的command 不采用docker 命令。这是应该在 ECS 启动的 docker 容器内运行的命令。 ECS 是一个 docker 编排服务。 ECS 在幕后为您运行 docker 命令,您永远不会直接给 ECS 运行 docker 命令。

查看您在本地运行的docker 命令,在容器内执行的command 部分是n8n start。所以你的command 应该是:

     command   = [
        "n8n", "start"
      ]

所有其他docker 命令参数,例如容器名称、卷映射、环境变量、映像 ID,都是您在 ECS 任务定义中的其他位置已经指定的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2022-12-21
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多