Docker Команда и ECS с многострочными входами - PullRequest
1 голос
/ 06 августа 2020

Моя команда определена следующим образом в моем определении задачи ECS :

compact,--wait,--http-address=0.0.0.0:10912,--objstore.config=<YAML FILE>

Однако я не могу найти способ передать файл YAML этой команде позиция. В дополнение к файлу YAML мне также нужно добавить некоторые конфиденциальные данные через переменные среды (доступ / секретный ключ, показанный ниже)

Ниже приведен пример файла YAML:

type: S3
config:
  bucket: mybucket
  access_key: <access_key>
  secret_key: <secret_key>
  endpoint: s3.us-east-2.amazonaws.com
  insecure: true

Есть предложения?

Спасибо ...

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Согласно моему комментарию, я думаю, что что-то можно сделать, используя data template_file с определением задачи ECS внутри файла шаблона. Пример файла шаблона задачи ECS:

[
  {
    "name": "${service_name}",
    "image": "${service_image}",
    "essential": true,
    "portMappings": [
      {
        "containerPort": ${service_port}
      }
    ],
    "secrets": [
      ${service_secrets}
    ],
    "dockerLabels": {
      "traefik.port" : "${service_port}",
      "traefik.enable" : "true",
      "traefik.frontend.rule": "Host:${service_hosts}",
      "traefik.frontend.passHostHeader": "true",
      "traefik.frontend.headers.SSLRedirect": "true",
      "traefik.frontend.headers.SSLProxyHeaders": "X-Forwarded-Proto: https"
    },
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-group": "${service_awslogs}",
        "awslogs-region": "${cluster_region}",
        "awslogs-stream-prefix": "ecs"
      }
    }
  }
]

Каждая переменная, начинающаяся с ${service_*}, будет заполнена следующим образом:

data "template_file" "app-task-definition" {
  template = file("task-definitions/app.json.tpl")

  vars = {
    cluster_region = var.cluster_region

    service_name    = var.application.name
    service_port    = var.application.port
    service_image   = var.app_image
    service_hosts   = join(", ", var.app_traefik_hosts)
    service_cluster = var.cluster_name
    service_secrets = join(", ", module.app-secrets.rendered)
    service_awslogs = var.aws_ssm_prefix
  }
}

Я думаю, вы также можете определить местоположение для YML-файл, который вы хотите передать как часть определения задачи. И последнее, но не менее важное: затем вы должны использовать ресурс данных в качестве входных данных для определений контейнеров:

container_definitions = data.template_file.app-task-definition.rendered

Для передачи секретов определен настраиваемый модуль, который позже используется для передачи и хранения значений в SSM. :

variable "aws_ssm_parameter_list" {
  type = list
}

variable "service_prefix" {
  type = string
}

data "template_file" "service_secrets" {
  count = length(var.aws_ssm_parameter_list)

  template = <<EOF
    {
        "name": "$${secret_name}",
        "valueFrom": "$${secret_path}"
    }
EOF

  vars = {
    secret_name = var.aws_ssm_parameter_list[count.index].name
    secret_path = "${var.service_prefix}/${var.aws_ssm_parameter_list[count.index].name}"
  }
}

output "rendered" {
  value = data.template_file.service_secrets.*.rendered
}
0 голосов
/ 06 августа 2020

Мой подход состоит в том, чтобы переопределить точку входа изображения. Я заменяю точку входа на несекретный экспорт переменных среды и run.sh (все, что закодировано в base64 без новых строк), которое декодирует все и вызывает предыдущую команду, которая была точкой входа.

Для секретных данных я использую secrets вместо переменных среды.

Вот пример из производственной среды. Я использую Terraform, но идея та же.

Точка входа:

entryPoint: [ "/bin/sh", "-c", join(" ", [
        "export DOMAIN='domain.com';",
        "export VICTORIA_YML=${base64encode(file("${path.module}/files/promstack/victoria/victoria.yml"))};",
        "echo '${base64encode(file("${path.module}/files/promstack/victoria/run.sh"))}' | base64 -d | sh;"
      ])],

запустить. sh:

#!/bin/sh

set -x

require () {
    if [ ! "$1" ]; then 
        echo "ERROR: var not found"
        exit 1 
    fi 
}

expand () {
    var_name="${1}"
    file="${2}"

    eval var="\$$var_name"

    sed -i "s+\${${var_name}}+${var}+g" ${file}
    sed -i "s+\$${var_name}+${var}+g" ${file}
}

# ==============================================================================

require ${DOMAIN}
require ${VICTORIA_YML}

echo ${VICTORIA_YML} | base64 -d > /tmp/victoria.yml
chmod 666 /tmp/victoria.yml

expand DOMAIN /tmp/victoria.yml

arguments="\
--storageDataPath=/storage \
--loggerFormat=json \
--promscrape.config=/tmp/victoria.yml \
--promscrape.config.strictParse \
--promscrape.fileSDCheckInterval=15s \
"

/bin/sh -c "/victoria-metrics-prod ${arguments}"
...