Skip to content

Commit 29893ab

Browse files
authored
feat: Add buildx and multi-stage build support to docker-build module (#679)
1 parent c7ee15f commit 29893ab

File tree

9 files changed

+57
-5
lines changed

9 files changed

+57
-5
lines changed

examples/container-image/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Note that this example may create resources which cost money. Run `terraform des
3737
|------|--------|---------|
3838
| <a name="module_docker_build"></a> [docker\_build](#module\_docker\_build) | ../../modules/docker-build | n/a |
3939
| <a name="module_docker_build_from_ecr"></a> [docker\_build\_from\_ecr](#module\_docker\_build\_from\_ecr) | ../../modules/docker-build | n/a |
40+
| <a name="module_docker_build_multistage"></a> [docker\_build\_multistage](#module\_docker\_build\_multistage) | ../../modules/docker-build | n/a |
4041
| <a name="module_ecr"></a> [ecr](#module\_ecr) | terraform-aws-modules/ecr/aws | n/a |
4142
| <a name="module_lambda_function_with_docker_build"></a> [lambda\_function\_with\_docker\_build](#module\_lambda\_function\_with\_docker\_build) | ../../ | n/a |
4243
| <a name="module_lambda_function_with_docker_build_from_ecr"></a> [lambda\_function\_with\_docker\_build\_from\_ecr](#module\_lambda\_function\_with\_docker\_build\_from\_ecr) | ../../ | n/a |
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
# `--platform` argument is used to be able to build docker images when using another platform (e.g. Apple M1)
2-
FROM --platform=linux/x86_64 scratch
2+
FROM --platform=linux/x86_64 scratch AS first_stage
33

44
ARG FOO
55

66
ENV FOO $FOO
77

88
COPY empty /empty
9+
10+
FROM first_stage AS second_stage
11+
12+
COPY empty /empty_two

examples/container-image/main.tf

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,35 @@ module "docker_build_from_ecr" {
123123
build_args = {
124124
FOO = "bar"
125125
}
126+
# Can also use buildx
127+
builder = "default"
128+
docker_file_path = "${local.source_path}/Dockerfile"
129+
130+
triggers = {
131+
dir_sha = local.dir_sha
132+
}
133+
134+
cache_from = ["${module.ecr.repository_url}:latest"]
135+
}
136+
137+
module "docker_build_multistage" {
138+
source = "../../modules/docker-build"
139+
140+
ecr_repo = module.ecr.repository_name
141+
142+
use_image_tag = true
143+
image_tag = "first_stage"
144+
145+
source_path = local.source_path
146+
platform = "linux/amd64"
147+
build_args = {
148+
FOO = "bar"
149+
}
150+
builder = "default"
151+
docker_file_path = "${local.source_path}/Dockerfile"
152+
153+
# multi-stage builds
154+
build_target = "first_stage"
126155

127156
triggers = {
128157
dir_sha = local.dir_sha

modules/docker-build/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@ module "docker_image" {
5959
|------|---------|
6060
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
6161
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.22 |
62-
| <a name="requirement_docker"></a> [docker](#requirement\_docker) | >= 3.0 |
62+
| <a name="requirement_docker"></a> [docker](#requirement\_docker) | >= 3.5.0 |
6363
| <a name="requirement_null"></a> [null](#requirement\_null) | >= 2.0 |
6464

6565
## Providers
6666

6767
| Name | Version |
6868
|------|---------|
6969
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 4.22 |
70-
| <a name="provider_docker"></a> [docker](#provider\_docker) | >= 3.0 |
70+
| <a name="provider_docker"></a> [docker](#provider\_docker) | >= 3.5.0 |
7171
| <a name="provider_null"></a> [null](#provider\_null) | >= 2.0 |
7272

7373
## Modules
@@ -91,6 +91,8 @@ No modules.
9191
| Name | Description | Type | Default | Required |
9292
|------|-------------|------|---------|:--------:|
9393
| <a name="input_build_args"></a> [build\_args](#input\_build\_args) | A map of Docker build arguments. | `map(string)` | `{}` | no |
94+
| <a name="input_build_target"></a> [build\_target](#input\_build\_target) | Set the target build stage to build | `string` | `null` | no |
95+
| <a name="input_builder"></a> [builder](#input\_builder) | The buildx builder to use for the Docker build. | `string` | `null` | no |
9496
| <a name="input_cache_from"></a> [cache\_from](#input\_cache\_from) | List of images to consider as cache sources when building the image. | `list(string)` | `[]` | no |
9597
| <a name="input_create_ecr_repo"></a> [create\_ecr\_repo](#input\_create\_ecr\_repo) | Controls whether ECR repository for Lambda image should be created | `bool` | `false` | no |
9698
| <a name="input_create_sam_metadata"></a> [create\_sam\_metadata](#input\_create\_sam\_metadata) | Controls whether the SAM metadata null resource should be created | `bool` | `false` | no |

modules/docker-build/main.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ resource "docker_image" "this" {
1616
context = var.source_path
1717
dockerfile = var.docker_file_path
1818
build_args = var.build_args
19+
builder = var.builder
20+
target = var.build_target
1921
platform = var.platform
2022
cache_from = var.cache_from
2123
}

modules/docker-build/variables.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,24 @@ variable "ecr_repo_tags" {
7171
default = {}
7272
}
7373

74+
variable "builder" {
75+
description = "The buildx builder to use for the Docker build."
76+
type = string
77+
default = null
78+
}
79+
7480
variable "build_args" {
7581
description = "A map of Docker build arguments."
7682
type = map(string)
7783
default = {}
7884
}
7985

86+
variable "build_target" {
87+
description = "Set the target build stage to build"
88+
type = string
89+
default = null
90+
}
91+
8092
variable "ecr_repo_lifecycle_policy" {
8193
description = "A JSON formatted ECR lifecycle policy to automate the cleaning up of unused images."
8294
type = string

modules/docker-build/versions.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ terraform {
88
}
99
docker = {
1010
source = "kreuzwerker/docker"
11-
version = ">= 3.0"
11+
version = ">= 3.5.0"
1212
}
1313
null = {
1414
source = "hashicorp/null"

wrappers/docker-build/main.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ module "wrapper" {
44
for_each = var.items
55

66
build_args = try(each.value.build_args, var.defaults.build_args, {})
7+
build_target = try(each.value.build_target, var.defaults.build_target, null)
8+
builder = try(each.value.builder, var.defaults.builder, null)
79
cache_from = try(each.value.cache_from, var.defaults.cache_from, [])
810
create_ecr_repo = try(each.value.create_ecr_repo, var.defaults.create_ecr_repo, false)
911
create_sam_metadata = try(each.value.create_sam_metadata, var.defaults.create_sam_metadata, false)

wrappers/docker-build/versions.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ terraform {
88
}
99
docker = {
1010
source = "kreuzwerker/docker"
11-
version = ">= 3.0"
11+
version = ">= 3.5.0"
1212
}
1313
null = {
1414
source = "hashicorp/null"

0 commit comments

Comments
 (0)