Как я могу повторно развернуть составной стек docker с помощью terraform? - PullRequest
0 голосов
/ 03 февраля 2020

Я использую terraform для настройки экземпляра GCE, который запускает стек docker. docker -композитный стек ссылается на изображение с тегом, и я хотел бы иметь возможность повторно запустить docker-compose up при изменении тега, чтобы можно было запустить новую версию службы. В настоящее время я делаю следующее в моих файлах terraform:

  provisioner "file" {
    source      = "training-server/docker-compose.yml"
    destination = "/home/curry/docker-compose.yml"

    connection {
      type = "ssh"
      user = "curry"
      host = google_compute_address.training-address.address
      private_key = file(var.private_key_file)
    }
  }

  provisioner "remote-exec" {
    inline = [
      "IMAGE_ID=${var.image_id} docker-compose -f /home/curry/docker-compose.yml up -d"
    ]

    connection {
      type = "ssh"
      user = "root"
      host = google_compute_address.training-address.address
      private_key = file(var.private_key_file)
    }
  }

, но это неправильно по разным причинам:

  1. Поставщики несколько недовольны согласно документации terraform
  2. Если изменение image_id не будет считаться изменением конфигурации по terraform, поэтому оно не будет запускать инициаторов

Что я хочу, так это рассмотреть мой Стек приложения похож на ресурс, поэтому при изменении одного из его атрибутов, например, image_id, ресурс воссоздается, а сам экземпляр виртуальной машины - нет.

Как я могу это сделать с помощью terraform? Или есть другой лучший подход?

1 Ответ

1 голос
/ 03 февраля 2020

Terraform имеет поставщика Docker , и, если вы хотите использовать Terraform для управления вашим стеком контейнеров, это, вероятно, правильный инструмент. Но для его использования требуется, по сути, преобразование вашего файла Compose в синтаксис Terraform.

Я немного больше привык к разделению, когда вы используете Terraform для управления инфраструктурой - например, для настройки экземпляров EC2 и их настройки сети - но используйте другой инструмент, такой как Ansible, Chef или Salt Stack, чтобы фактически запустить программное обеспечение на них. Затем, чтобы обновить программное обеспечение (Docker контейнеры), вы должны обновить настройки инструмента управления конфигурацией, указав, какую версию (тег тега Docker) вы хотите, а затем повторно запустить ее.

Один прием, который может помочь использование нулевого ресурса , который позволит вам «повторно предоставить ресурс» при каждом изменении идентификатора изображения:

resource "null_resource" "docker_compose" {
  triggers = {
    image_id = "${var.image_id}"
  }
  provisioner "remote_exec" {
    ...
  }
}

Если вы хотите go вниз по всем Terraform В теории, вы можете написать конфигурацию Terraform, такую ​​как

provider "docker" {
  host = "ssh://root@${google_compute_address.training-address.address}"
  # (where do its credentials come from?)
}

resource "docker_image" "myapp" {
  name = "myapp:${var.image_id}"
}

resource "docker_container" "myapp" {
  name = "myapp"
  image = "${docker_image.myapp.latest}"
}

, но вам придется перевести всю вашу конфигурацию Docker Compose в этот синтаксис и настроить ее так, чтобы разработчики могли запускать его локально и реплицировать функции Compose, такие как сеть default и т. д. Я не чувствую, что это обычно делается на практике.

...