Search code examples
terraformdocker-network

How to get Terraform to start Docker Network before Docker Containers


The First run of Terraform Apply gives "Error: Unable to start container: Error response from daemon: network vaccine-net not found"

Second run: everything works fine.

I thought Terraform manages the dependencies itself - obviously it fails here. Do I have a mistake in my file? Or can i make dependencies myself?

.tf File:

# 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"
  }
}

Solution

  • Are you sure your network is created before the container is created? I see no link between your network and container. Try with reference to the docker network (preferred):

    # 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"
      }
    }
    

    Or explicitly with 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]
    }