diff --git a/docker/config/debug.tf b/docker/config/debug.tf index b413525..a19db85 100644 --- a/docker/config/debug.tf +++ b/docker/config/debug.tf @@ -1,6 +1,14 @@ resource "local_file" "config" { count = var.debug ? 1 : 0 content = var.value - filename = "${path.root}/.debug/docker/${var.stack_name}/configs/${local.file_name}" + filename = "${local.debug_path}/${local.file_name}" file_permission = "0600" +} +variable "debug_path" { + type = string + description = "Path to write debug files to" + default = null +} +locals { + debug_path = var.debug_path != null ? var.debug_path : "${path.root}/.debug/docker/configs/${var.stack_name}" } \ No newline at end of file diff --git a/docker/service/config.tf b/docker/service/config.tf index 8ecacea..28b3cb7 100644 --- a/docker/service/config.tf +++ b/docker/service/config.tf @@ -4,4 +4,5 @@ module "config" { stack_name = var.stack_name name = each.key value = each.value + debug_path = "${local.debug_path}/configs" } \ No newline at end of file diff --git a/docker/service/debug.tf b/docker/service/debug.tf index fb83cb1..7391bce 100644 --- a/docker/service/debug.tf +++ b/docker/service/debug.tf @@ -1,10 +1,19 @@ + +variable "debug_path" { + type = string + description = "Path to write debug files to" + default = null +} +locals { + debug_path = var.debug_path != null ? var.debug_path : "${path.root}/.debug/docker/services/${var.stack_name}/${var.service_name}" +} resource "local_file" "debug" { - filename = "${path.root}/.debug/docker/${var.service_name}/service.json" + filename = "${local.debug_path}/service.json" file_permission = "0600" content = nonsensitive(jsonencode({ - name = local.service_name - stack = var.stack_name - #image = local.image + name = local.service_name + stack = var.stack_name + image = local.image_fully_qualified build = var.build networks = var.networks ports = var.ports diff --git a/docker/service/image.build.tf b/docker/service/image.build.tf index 74105db..4b8ebbb 100644 --- a/docker/service/image.build.tf +++ b/docker/service/image.build.tf @@ -1,6 +1,5 @@ locals { - is_build = var.build != null - // strip off the tag + is_build = var.build != null image_name = split(":", var.image)[0] source_files = local.is_build ? fileset(var.build.context, "**") : [] @@ -14,7 +13,7 @@ locals { ] } resource "random_pet" "build" { - count = local.is_build ? 1 : 0 + for_each = local.is_build ? { "build" = {} } : {} keepers = { image_name = local.image_name build_context = var.build.context @@ -22,26 +21,31 @@ resource "random_pet" "build" { target = var.build.target tags = jsonencode(local.tags) hash = local.image_context_hash + args = jsonencode(var.build.args) + dockerfile = var.build.dockerfile } } +# MB: This is a hack to allow replace_triggered_by on a resource that may or may not exist. +resource "terraform_data" "conditional_build" { + input = try(jsonencode(random_pet.build["build"].keepers), null) +} // Do the build resource "docker_image" "build" { - count = local.is_build ? 1 : 0 - name = var.image - + for_each = local.is_build ? { "build" = {} } : {} + name = var.image force_remove = false build { # We are reading these variables via the random_pet entity to ensure that the build is triggered when changes happen - context = random_pet.build[0].keepers.build_context - tag = jsondecode(random_pet.build[0].keepers.tags) - target = random_pet.build[0].keepers.target - remove = false + context = random_pet.build["build"].keepers.build_context + tag = jsondecode(random_pet.build["build"].keepers.tags) + target = random_pet.build["build"].keepers.target + build_args = jsondecode(random_pet.build["build"].keepers.args) + dockerfile = random_pet.build["build"].keepers.dockerfile + remove = false + suppress_output = false } lifecycle { - ignore_changes = [ - build, - ] - replace_triggered_by = [random_pet.build, ] + replace_triggered_by = [terraform_data.conditional_build, ] create_before_destroy = true } } @@ -49,11 +53,11 @@ resource "docker_image" "build" { // Push it to the registry resource "docker_registry_image" "build" { depends_on = [docker_image.build] - count = local.is_build ? 1 : 0 - name = docker_image.build[0].name + for_each = local.is_build ? { "build" = {} } : {} + name = docker_image.build["build"].name keep_remotely = true lifecycle { - replace_triggered_by = [random_pet.build] + replace_triggered_by = [terraform_data.conditional_build] } } resource "docker_registry_image" "tags" { @@ -62,7 +66,7 @@ resource "docker_registry_image" "tags" { name = each.value keep_remotely = true lifecycle { - replace_triggered_by = [random_pet.build] + replace_triggered_by = [terraform_data.conditional_build] ignore_changes = [ name, ] diff --git a/docker/service/image.mirror.tf b/docker/service/image.mirror.tf index a9fee4a..14525e9 100644 --- a/docker/service/image.mirror.tf +++ b/docker/service/image.mirror.tf @@ -2,18 +2,18 @@ locals { is_mirror = var.mirror != null } resource "docker_image" "source" { - count = local.is_mirror ? 1 : 0 + for_each = local.is_mirror ? { "mirror" = {} } : {} name = data.docker_registry_image.image[0].name pull_triggers = [data.docker_registry_image.image[0].sha256_digest] force_remove = false } resource "docker_tag" "retagged" { - count = local.is_mirror ? 1 : 0 + for_each = local.is_mirror ? { "mirror" = {} } : {} source_image = docker_image.source[0].name target_image = var.mirror } resource "docker_registry_image" "mirror" { - count = local.is_mirror ? 1 : 0 + for_each = local.is_mirror ? { "mirror" = {} } : {} depends_on = [docker_tag.retagged[0]] name = docker_tag.retagged[0].target_image keep_remotely = true diff --git a/docker/service/locals.tf b/docker/service/locals.tf index 6349708..6faf821 100644 --- a/docker/service/locals.tf +++ b/docker/service/locals.tf @@ -1,6 +1,6 @@ data "docker_registry_image" "image" { - count = local.is_build == false ? 1 : 0 - name = var.image + for_each = !local.is_build ? { "default" = {} } : {} + name = var.image } locals { // Name can be 64 bytes long, including a null byte seemingly, limiting the length to 63. @@ -11,20 +11,20 @@ locals { # Calculate the docker image to use image = ( local.is_build - ? docker_image.build[0].name + ? docker_image.build["build"].name : ( local.is_mirror - ? docker_registry_image.mirror[0].name - : data.docker_registry_image.image[0].name + ? docker_registry_image.mirror["mirror"].name + : data.docker_registry_image.image["default"].name ) ) image_fully_qualified = ( local.is_build - ? docker_image.build[0].name + ? "${docker_registry_image.build["build"].name}@${docker_registry_image.build["build"].sha256_digest}" : ( local.is_mirror - ? "${docker_registry_image.mirror[0].name}@${docker_registry_image.mirror[0].sha256_digest}" - : "${data.docker_registry_image.image[0].name}@${data.docker_registry_image.image[0].sha256_digest}" + ? "${docker_registry_image.mirror["mirror"].name}@${docker_registry_image.mirror["mirror"].sha256_digest}" + : "${data.docker_registry_image.image["default"].name}@${data.docker_registry_image.image["default"].sha256_digest}" ) ) } \ No newline at end of file diff --git a/docker/service/service.tf b/docker/service/service.tf index 1ab6540..80a133e 100644 --- a/docker/service/service.tf +++ b/docker/service/service.tf @@ -2,6 +2,8 @@ resource "docker_service" "instance" { # The name of the service is the stack name and the service name combined name = local.service_name + #depends_on = [terraform_data.conditional_build_hack["build"]] + # Define the task spec task_spec { container_spec { @@ -188,6 +190,6 @@ resource "docker_service" "instance" { lifecycle { # Help prevent "this service already exists" irritations create_before_destroy = false - replace_triggered_by = [docker_image.build[0].id] + #replace_triggered_by = [terraform_data.conditional_build_hack["build"]] } }