Как заставить Terraform запускать Docker Network перед контейнерами Docker

#terraform #docker-network

#terraform #docker-сеть

Вопрос:

Первый запуск Terraform Apply выдает «Ошибка: невозможно запустить контейнер: ответ об ошибке от демона: сетевая вакцина-сеть не найдена»

Второй запуск: все работает нормально.

Я думал, что Terraform сама управляет зависимостями — очевидно, здесь это не удается. У меня ошибка в моем файле? Или я могу сам создавать зависимости?

Файл .tf:

 # Setting up docker network
resource "docker_network" "private_network" {
  name       = "vaccine-net"
  attachable = true
  ipam_config {
    subnet  = "10.0.1.0/24"
    gateway = "10.0.1.254"
  }
}

# create db container
resource "docker_container" "bootstrapper" {
  name  = "bootstrapper"
  image = "vaccine/bootstrapper"
  networks_advanced {
    name = "vaccine-net"
    ipv4_address ="10.0.1.1"
  }
}
  

Ответ №1:

Вы уверены, что ваша сеть создана до создания контейнера? Я не вижу связи между вашей сетью и контейнером. Попробуйте со ссылкой на docker network (предпочтительно):

 # Setting up docker network
resource "docker_network" "private_network" {
  name       = "vaccine-net"
  attachable = true
  ipam_config {
    subnet  = "10.0.1.0/24"
    gateway = "10.0.1.254"
  }
}

# create db container
resource "docker_container" "bootstrapper" {
  name  = "bootstrapper"
  image = "vaccine/bootstrapper"
  networks_advanced {
    name = "${docker_network.private_network.name}"
    ipv4_address ="10.0.1.1"
  }
}
  

Или явно с помощью depends_on :

 # Setting up docker network
resource "docker_network" "private_network" {
  name       = "vaccine-net"
  attachable = true
  ipam_config {
    subnet  = "10.0.1.0/24"
    gateway = "10.0.1.254"
  }
}

# create db container
resource "docker_container" "bootstrapper" {
  name  = "bootstrapper"
  image = "vaccine/bootstrapper"
  networks_advanced {
    name = "vaccine-net"
    ipv4_address ="10.0.1.1"
  }

   depends_on = [docker_network.private_network]
}
  

Комментарии:

1. Я бы предпочел первый вариант! Поскольку это меньше строк кода, а terraform предоставляет такой хороший способ неявно создаваемых зависимостей.