diff --git a/.github/workflows/acc-test.yaml b/.github/workflows/acc-test.yaml index ece29381..faf3abe3 100644 --- a/.github/workflows/acc-test.yaml +++ b/.github/workflows/acc-test.yaml @@ -16,7 +16,7 @@ env: DEBIAN_FRONTEND: noninteractive DOCKER_CE_VERSION: "5:20.10.10~3-0~ubuntu-focal" GO_VERSION: "1.17" - TESTSUITE_TIMEOUT: "480s" + TESTSUITE_TIMEOUT: "720s" jobs: acc-test: diff --git a/go.mod b/go.mod index 29221cdf..40daa4ea 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102 // indirect github.com/containerd/containerd v1.5.0-beta.1 // indirect github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e // indirect + github.com/containerd/typeurl v1.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/docker-credential-helpers v0.6.3 // indirect github.com/fatih/color v1.13.0 // indirect @@ -36,6 +37,8 @@ require ( github.com/google/go-cmp v0.5.8 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.2.0 // indirect @@ -76,6 +79,7 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/opencontainers/runc v1.0.0-rc93 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/posener/complete v1.2.3 // indirect github.com/russross/blackfriday v1.6.0 // indirect diff --git a/go.sum b/go.sum index c4c53991..90ee6894 100644 --- a/go.sum +++ b/go.sum @@ -287,6 +287,7 @@ github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8h github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1 h1:PvuK4E3D5S5q6IqsPDCy928FhP0LUIGcmZ/Yhgp5Djw= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= @@ -602,6 +603,7 @@ github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= @@ -611,6 +613,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= @@ -932,6 +935,7 @@ github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqi github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= diff --git a/internal/provider/data_source_docker_image_test.go b/internal/provider/data_source_docker_image_test.go index dd817869..4fcfbbb7 100644 --- a/internal/provider/data_source_docker_image_test.go +++ b/internal/provider/data_source_docker_image_test.go @@ -19,7 +19,7 @@ var imageNameWithTagAndDigestRegexp = regexp.MustCompile(`^.*:.*@sha256:[A-Fa-f0 func TestAccDockerImageDataSource_withSpecificTag(t *testing.T) { ctx := context.Background() - imageName := "nginx:1.17.6" + imageName := "busybox:1.35.0" resource.Test(t, resource.TestCase{ PreCheck: func() { @@ -32,7 +32,7 @@ func TestAccDockerImageDataSource_withSpecificTag(t *testing.T) { Config: loadTestConfiguration(t, DATA_SOURCE, "docker_image", "testAccDockerImageDataSourceWithSpecificTag"), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr("data.docker_image.foo", "name", imageName), - resource.TestCheckResourceAttr("data.docker_image.foo", "repo_digest", "nginx@sha256:b2d89d0a210398b4d1120b3e3a7672c16a4ba09c2c4a0395f18b9f7999b768f2"), + resource.TestCheckResourceAttr("data.docker_image.foo", "repo_digest", "busybox@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68"), ), }, }, @@ -44,7 +44,7 @@ func TestAccDockerImageDataSource_withSpecificTag(t *testing.T) { func TestAccDockerImageDataSource_withDefaultTag(t *testing.T) { ctx := context.Background() - imageName := "nginx" + imageName := "busybox" resource.Test(t, resource.TestCase{ PreCheck: func() { @@ -69,7 +69,7 @@ func TestAccDockerImageDataSource_withDefaultTag(t *testing.T) { func TestAccDockerImageDataSource_withSha256Digest(t *testing.T) { ctx := context.Background() - imageName := "nginx@sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2" + imageName := "busybox@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68" resource.Test(t, resource.TestCase{ PreCheck: func() { @@ -93,7 +93,7 @@ func TestAccDockerImageDataSource_withSha256Digest(t *testing.T) { } func TestAccDockerImageDataSource_withTagAndSha256Digest(t *testing.T) { ctx := context.Background() - imageName := "nginx:1.19.1@sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2" + imageName := "busybox:1.35.0@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68" resource.Test(t, resource.TestCase{ PreCheck: func() { diff --git a/internal/provider/resource_docker_image_funcs.go b/internal/provider/resource_docker_image_funcs.go index 18dd148d..92149bc4 100644 --- a/internal/provider/resource_docker_image_funcs.go +++ b/internal/provider/resource_docker_image_funcs.go @@ -8,19 +8,24 @@ import ( "fmt" "io" "log" + "net" "path/filepath" "strings" "github.com/docker/cli/cli/command/image/build" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/versions" "github.com/docker/docker/client" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/jsonmessage" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/mitchellh/go-homedir" + "github.com/moby/buildkit/session" ) +const minBuildkitDockerVersion = "1.39" + func resourceDockerImageCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { client := meta.(*ProviderConfig).DockerClient imageName := d.Get("name").(string) @@ -290,7 +295,6 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut func buildDockerImage(ctx context.Context, rawBuild map[string]interface{}, imageName string, client *client.Client) error { buildOptions := types.ImageBuildOptions{} - buildOptions.Version = types.BuilderV1 buildOptions.Dockerfile = rawBuild["dockerfile"].(string) tags := []string{imageName} @@ -319,6 +323,24 @@ func buildDockerImage(ctx context.Context, rawBuild map[string]interface{}, imag buildOptions.Labels = labels log.Printf("[DEBUG] Labels: %v\n", labels) + dockerClientVersion := client.ClientVersion() + log.Printf("[DEBUG] DockerClientVersion: %v, minBuildKitDockerVersion: %v\n", dockerClientVersion, minBuildkitDockerVersion) + + if versions.GreaterThanOrEqualTo(dockerClientVersion, minBuildkitDockerVersion) { + // docker client supports BuildKit + log.Printf("[DEBUG] Enabling BuildKit") + s, _ := session.NewSession(ctx, "docker-provider", "") + dialSession := func(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error) { + return client.DialHijack(ctx, "/session", proto, meta) + } + //nolint + go s.Run(ctx, dialSession) + defer s.Close() + buildOptions.SessionID = s.ID() + buildOptions.Version = types.BuilderBuildKit + } else { + buildOptions.Version = types.BuilderV1 + } contextDir := rawBuild["path"].(string) excludes, err := build.ReadDockerignore(contextDir) if err != nil { diff --git a/internal/provider/resource_docker_image_test.go b/internal/provider/resource_docker_image_test.go index 831d7ed7..7f705dad 100644 --- a/internal/provider/resource_docker_image_test.go +++ b/internal/provider/resource_docker_image_test.go @@ -22,7 +22,7 @@ func TestAccDockerImage_basic(t *testing.T) { // run a Docker container which refers the Docker image to test "force_remove" option containerName := "test-docker-image-force-remove" ctx := context.Background() - if err := exec.Command("docker", "run", "--rm", "-d", "--name", containerName, "alpine:3.11.5", "tail", "-f", "/dev/null").Run(); err != nil { + if err := exec.Command("docker", "run", "--rm", "-d", "--name", containerName, "alpine:3.16.0", "tail", "-f", "/dev/null").Run(); err != nil { t.Fatal(err) } defer func() { diff --git a/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithDefaultTag.tf b/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithDefaultTag.tf index 811d04a6..08ecb78d 100644 --- a/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithDefaultTag.tf +++ b/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithDefaultTag.tf @@ -1,3 +1,3 @@ data "docker_image" "foo" { - name = "nginx" + name = "busybox" } diff --git a/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithSha256Digest.tf b/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithSha256Digest.tf index b9b76c57..3c0be1d9 100644 --- a/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithSha256Digest.tf +++ b/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithSha256Digest.tf @@ -1,3 +1,3 @@ data "docker_image" "foo" { - name = "nginx@sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2" + name = "busybox@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68" } \ No newline at end of file diff --git a/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithSpecificTag.tf b/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithSpecificTag.tf index 93c7b3dc..57b1fccc 100644 --- a/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithSpecificTag.tf +++ b/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithSpecificTag.tf @@ -1,3 +1,3 @@ data "docker_image" "foo" { - name = "nginx:1.17.6" + name = "busybox:1.35.0" } diff --git a/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithTagAndSha256Digest.tf b/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithTagAndSha256Digest.tf index dc71818d..9251b6ba 100644 --- a/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithTagAndSha256Digest.tf +++ b/testdata/data-sources/docker_image/testAccDockerImageDataSourceWithTagAndSha256Digest.tf @@ -1,3 +1,3 @@ data "docker_image" "foo" { - name = "nginx:1.19.1@sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2" + name = "busybox:1.35.0@sha256:8c40df61d40166f5791f44b3d90b77b4c7f59ed39a992fd9046886d3126ffa68" } \ No newline at end of file diff --git a/testdata/resources/docker_image/testAccDockerImageConfig.tf b/testdata/resources/docker_image/testAccDockerImageConfig.tf index adefed6e..bf66dd07 100644 --- a/testdata/resources/docker_image/testAccDockerImageConfig.tf +++ b/testdata/resources/docker_image/testAccDockerImageConfig.tf @@ -1,3 +1,3 @@ resource "docker_image" "foo" { - name = "alpine:3.1" + name = "alpine:3.15.0" } diff --git a/testdata/resources/docker_image/testAccDockerImageFromDataConfig.tf b/testdata/resources/docker_image/testAccDockerImageFromDataConfig.tf index f3ac3f65..2925a5e5 100644 --- a/testdata/resources/docker_image/testAccDockerImageFromDataConfig.tf +++ b/testdata/resources/docker_image/testAccDockerImageFromDataConfig.tf @@ -1,5 +1,5 @@ data "docker_registry_image" "foobarbaz" { - name = "alpine:3.1" + name = "alpine:3.16.0" } resource "docker_image" "foobarbaz" { name = data.docker_registry_image.foobarbaz.name diff --git a/testdata/resources/docker_image/testAccDockerImageFromDataConfigWithPullTrigger.tf b/testdata/resources/docker_image/testAccDockerImageFromDataConfigWithPullTrigger.tf index a7b89427..0aecbbb3 100644 --- a/testdata/resources/docker_image/testAccDockerImageFromDataConfigWithPullTrigger.tf +++ b/testdata/resources/docker_image/testAccDockerImageFromDataConfigWithPullTrigger.tf @@ -1,5 +1,5 @@ data "docker_registry_image" "foobarbazoo" { - name = "alpine:3.1" + name = "alpine:3.16.0" } resource "docker_image" "foobarbazoo" { name = data.docker_registry_image.foobarbazoo.name diff --git a/testdata/resources/docker_image/testAccDockerImageKeepLocallyConfig.tf b/testdata/resources/docker_image/testAccDockerImageKeepLocallyConfig.tf index 39493711..d828f798 100644 --- a/testdata/resources/docker_image/testAccDockerImageKeepLocallyConfig.tf +++ b/testdata/resources/docker_image/testAccDockerImageKeepLocallyConfig.tf @@ -1,4 +1,4 @@ resource "docker_image" "foobarzoo" { - name = "crux:3.1" + name = "busybox:latest" keep_locally = true } diff --git a/testdata/resources/docker_image/testAccForceRemoveDockerImage.tf b/testdata/resources/docker_image/testAccForceRemoveDockerImage.tf index 0778af06..b7f25cf9 100644 --- a/testdata/resources/docker_image/testAccForceRemoveDockerImage.tf +++ b/testdata/resources/docker_image/testAccForceRemoveDockerImage.tf @@ -1,4 +1,4 @@ resource "docker_image" "test" { - name = "alpine:3.14.2" + name = "alpine:3.16.0" force_remove = true }