Я изучаю Терраформ. В настоящее время я развертываю свое приложение на AWS. Я использую EC2, Cluster, Task Definition, ASG и другие.
Развертывание моего приложения включает в себя создание образа Docker с моим кодом Java, который находится в другом репозитории GitHub. Я использую GitHub Actions для развертывания.
Теперь часть моего кода Terraform выглядит так:
resource "null_resource" "build_docker_image" {
provisioner "local-exec" {
working_dir = var.work_directory
command = \<\<EOF
aws ecr get-login-password --region ${var.region} | docker login --username AWS --password-stdin ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com && cd ${var.work_directory} && chmod +x ./mvnw && ./mvnw clean package && docker build -t ${var.back_repository_name} . && docker tag ${var.back_repository_name}:latest ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest && docker push ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest
EOF
}
triggers = {
"run_at" = timestamp()
}
}
Однако эта команда очень длинная, поскольку написана в одну строку.
Я пытался сделать эту строку короче, но мне это не удалось. Если я напишу эту команду в несколько строк, то при запуске Terraform (terraform apply) запустится только первая строка.
Я пробовал использовать bash, но это не сработало (<3>WSL (34) ОШИБКА: CreateProcessParseCommon:711: Не удалось перевести):
provisioner "local-exec" {
working_dir = var.work_directory
command = <<EOF
bash deploy.sh ${var.region} ${data.aws_caller_identity.current_user.account_id} ${var.back_repository_name}
EOF
}
#!/bin/bash
aws ecr get-login-password --region $1 | docker login --username AWS --password-stdin $2.dkr.ecr.$1.amazonaws.com
docker build -t $3 .
docker tag $3:latest $2.dkr.ecr.$1.amazonaws.com/$3:latest
docker push $2.dkr.ecr.$1.amazonaws.com/$3:latest
Кроме того, я пытаюсь использовать '/' или '\n', но это тоже не работает.
Пожалуйста, помогите мне решить проблему. Возможно, есть шаблоны для создания образа докера.
Из руководства по bash:
Символ обратной косой черты
‘\’
можно использовать для удаления какого-либо специального значения. для следующего прочитанного символа и продолжения строки.
Поэтому, если вы хотите разбить одну команду на несколько строк, вам нужно использовать символ \
в том месте, где вы хотите переместить команду на следующую строку:
resource "null_resource" "build_docker_image" {
provisioner "local-exec" {
working_dir = var.work_directory
command = <<EOF
aws ecr get-login-password --region ${var.region} | docker login \
--username AWS \
--password-stdin ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com && \
cd ${var.work_directory} && \
chmod +x ./mvnw && \
./mvnw clean package && \
docker build -t ${var.back_repository_name} . && \
docker tag ${var.back_repository_name}:latest ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest && \
docker push ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest
EOF
}
triggers = {
"run_at" = timestamp()
}
}
Или для лучшей читаемости начните heredoc с <<EOF-
(обратите внимание на дефис), чтобы вы могли использовать отступы внутри heredoc, которые будут игнорироваться Terraform (Heredoc с отступом):
resource "null_resource" "build_docker_image" {
provisioner "local-exec" {
working_dir = var.work_directory
command = <<-EOF
aws ecr get-login-password --region ${var.region} | docker login \
--username AWS \
--password-stdin ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com && \
cd ${var.work_directory} && \
chmod +x ./mvnw && \
./mvnw clean package && \
docker build -t ${var.back_repository_name} . && \
docker tag ${var.back_repository_name}:latest ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest && \
docker push ${data.aws_caller_identity.current_user.account_id}.dkr.ecr.${var.region}.amazonaws.com/${var.back_repository_name}:latest
EOF
}
triggers = {
"run_at" = timestamp()
}
}
Ты прав! Спасибо!