1. Packages
  2. Docker Build
docker-build v0.0.2 published on Thursday, Apr 25, 2024 by Pulumi

Docker Build

docker-build logo
docker-build v0.0.2 published on Thursday, Apr 25, 2024 by Pulumi

    The Docker Build provider leverages buildx and BuildKit to build modern Docker images with Pulumi.

    Not to be confused with the earlier Docker provider, which is still appropriate for managing resources unrelated to building images.

    ProviderUse cases
    @pulumi/docker-buildAnything related to building images with docker build.
    @pulumi/dockerEverything else – including running containers and creating networks.

    Example

    If your Pulumi program has a directory called app alongside it, containing a file named “Dockerfile” (which can be as simple as FROM alpine for the purpose of example), then the code below shows how to build a multi-platform image, publish it to a remote AWS ECR registry, and use an inline cache to speed up subsequent builds.

    import * as aws from "@pulumi/aws";
    import * as docker_build from "@pulumi/docker-build";
    
    // Create an ECR repository for pushing.
    const ecrRepository = new aws.ecr.Repository("ecr-repository", {});
    
    // Grab auth credentials for ECR.
    const authToken = aws.ecr.getAuthorizationTokenOutput({
        registryId: ecrRepository.registryId,
    });
    
    // Build and push an image to ECR with inline caching.
    const myImage = new docker_build.Image("my-image", {
        // Tag our image with our ECR repository's address.
        tags: [pulumi.interpolate`${ecrRepository.repositoryUrl}:latest`],
        context: {
            location: "./app",
        },
        // Use the pushed image as a cache source.
        cacheFrom: [{
            registry: {
                ref: pulumi.interpolate`${ecrRepository.repositoryUrl}:latest`,
            },
        }],
        // Include an inline cache with our pushed image.
        cacheTo: [{
            inline: {},
        }],
        // Build a multi-platform image manifest for ARM and AMD.
        platforms: [
            "linux/amd64",
            "linux/arm64",
        ],
        // Push the final result to ECR.
        push: true,
        // Provide our ECR credentials.
        registries: [{
            address: ecrRepository.repositoryUrl,
            password: authToken.password,
            username: authToken.userName,
        }],
    });
    
    // Export a ref for the pushed images so we can deploy it.
    export const ref = myImage.ref;
    
    import pulumi
    import pulumi_aws as aws
    import pulumi_docker_build as docker_build
    
    # Create an ECR repository for pushing.
    ecr_repository = aws.ecr.Repository("ecr-repository")
    
    # Grab auth credentials for ECR.
    auth_token = aws.ecr.get_authorization_token_output(registry_id=ecr_repository.registry_id)
    
    # Build and push an image to ECR with inline caching.
    my_image = docker_build.Image("my-image",
        # Tag our image with our ECR repository's address.
        tags=[ecr_repository.repository_url.apply(lambda repository_url: f"{repository_url}:latest")],
        context=docker_build.BuildContextArgs(
            location="./app",
        ),
        # Use the pushed image as a cache source.
        cache_from=[docker_build.CacheFromArgs(
            registry=docker_build.CacheFromRegistryArgs(
                ref=ecr_repository.repository_url.apply(lambda repository_url: f"{repository_url}:latest"),
            ),
        )],
        # Include an inline cache with our pushed image.
        cache_to=[docker_build.CacheToArgs(
            inline=docker_build.CacheToInlineArgs(),
        )],
        # Build a multi-platform image manifest for ARM and AMD.
        platforms=[
            docker_build.Platform.LINUX_AMD64,
            docker_build.Platform.LINUX_ARM64,
        ],
        # Push the final result to ECR.
        push=True,
        # Provide our ECR credentials.
        registries=[docker_build.RegistryArgs(
            address=ecr_repository.repository_url,
            password=auth_token.password,
            username=auth_token.user_name,
        )],
    )
    
    # Export a ref for the pushed images so we can deploy it.
    pulumi.export("ref", my_image.ref)
    
    using System.Collections.Generic;
    using System.Linq;
    using Pulumi;
    using Aws = Pulumi.Aws;
    using DockerBuild = Pulumi.DockerBuild;
    
    return await Deployment.RunAsync(() =>
    {
        // Create an ECR repository for pushing.
        var ecrRepository = new Aws.Ecr.Repository("ecr-repository");
    
        // Grab auth credentials for ECR.
        var authToken = Aws.Ecr.GetAuthorizationToken.Invoke(new()
        {
            RegistryId = ecrRepository.RegistryId,
        });
    
        // Build and push an image to ECR with inline caching.
        var myImage = new DockerBuild.Image("my-image", new()
        {
            // Tag our image with our ECR repository's address.
            Tags = new[]
            {
                ecrRepository.RepositoryUrl.Apply(repositoryUrl => $"{repositoryUrl}:latest"),
            },
            Context = new DockerBuild.Inputs.BuildContextArgs
            {
                Location = "./app",
            },
            // Use the pushed image as a cache source.
            CacheFrom = new[]
            {
                new DockerBuild.Inputs.CacheFromArgs
                {
                    Registry = new DockerBuild.Inputs.CacheFromRegistryArgs
                    {
                        Ref = ecrRepository.RepositoryUrl.Apply(repositoryUrl => $"{repositoryUrl}:latest"),
                    },
                },
            },
            // Include an inline cache with our pushed image.
            CacheTo = new[]
            {
                new DockerBuild.Inputs.CacheToArgs
                {
                    Inline = null,
                },
            },
            // Build a multi-platform image manifest for ARM and AMD.
            Platforms = new[]
            {
                DockerBuild.Platform.Linux_amd64,
                DockerBuild.Platform.Linux_arm64,
            },
            // Push the final result to ECR.
            Push = true,
            // Provide our ECR credentials.
            Registries = new[]
            {
                new DockerBuild.Inputs.RegistryArgs
                {
                    Address = ecrRepository.RepositoryUrl,
                    Password = authToken.Apply(getAuthorizationTokenResult => getAuthorizationTokenResult.Password),
                    Username = authToken.Apply(getAuthorizationTokenResult => getAuthorizationTokenResult.UserName),
                },
            },
        });
    
        // Export a ref for the pushed images so we can deploy it.
        return new Dictionary<string, object?>
        {
            ["ref"] = myImage.Ref,
        };
    });
    
    package main
    
    import (
        "fmt"
    
        "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ecr"
        "github.com/pulumi/pulumi-docker-build/sdk/go/dockerbuild"
        "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
    )
    
    func main() {
        pulumi.Run(func(ctx *pulumi.Context) error {
            // Create an ECR repository for pushing.
            ecrRepository, err := ecr.NewRepository(ctx, "ecr-repository", nil)
            if err != nil {
                return err
            }
    
            // Grab auth credentials for ECR.
            authToken := ecr.GetAuthorizationTokenOutput(ctx, ecr.GetAuthorizationTokenOutputArgs{
                RegistryId: ecrRepository.RegistryId,
            }, nil)
    
            // Build and push an image to ECR with inline caching.
            myImage, err := dockerbuild.NewImage(ctx, "my-image", &dockerbuild.ImageArgs{
                // Tag our image with our ECR repository's address.
                Tags: pulumi.StringArray{
                    ecrRepository.RepositoryUrl.ApplyT(func(repositoryUrl string) (string, error) {
                        return fmt.Sprintf("%v:latest", repositoryUrl), nil
                    }).(pulumi.StringOutput),
                },
                Context: &dockerbuild.BuildContextArgs{
                    Location: pulumi.String("./app"),
                },
                // Use the pushed image as a cache source.
                CacheFrom: dockerbuild.CacheFromArray{
                    &dockerbuild.CacheFromArgs{
                        Registry: &dockerbuild.CacheFromRegistryArgs{
                            Ref: ecrRepository.RepositoryUrl.ApplyT(func(repositoryUrl string) (string, error) {
                                return fmt.Sprintf("%v:latest", repositoryUrl), nil
                            }).(pulumi.StringOutput),
                        },
                    },
                },
                // Include an inline cache with our pushed image.
                CacheTo: dockerbuild.CacheToArray{
                    &dockerbuild.CacheToArgs{
                        Inline: nil,
                    },
                },
                // Build a multi-platform image manifest for ARM and AMD.
                Platforms: dockerbuild.PlatformArray{
                    dockerbuild.Platform_Linux_amd64,
                    dockerbuild.Platform_Linux_arm64,
                },
                // Push the final result to ECR.
                Push: pulumi.Bool(true),
                // Provide our ECR credentials.
                Registries: dockerbuild.RegistryArray{
                    &dockerbuild.RegistryArgs{
                        Address: ecrRepository.RepositoryUrl,
                        Password: authToken.ApplyT(func(authToken ecr.GetAuthorizationTokenResult) (*string, error) {
                            return &authToken.Password, nil
                        }).(pulumi.StringPtrOutput),
                        Username: authToken.ApplyT(func(authToken ecr.GetAuthorizationTokenResult) (*string, error) {
                            return &authToken.UserName, nil
                        }).(pulumi.StringPtrOutput),
                    },
                },
            })
            if err != nil {
                return err
            }
    
            // Export a ref for the pushed images so we can deploy it.
            ctx.Export("ref", myImage.Ref)
            return nil
        })
    }
    
    description: Push to AWS ECR with caching
    name: ecr
    outputs:
        ref: ${my-image.ref}
    resources:
        # Create an ECR repository for pushing.
        ecr-repository:
            type: aws:ecr:Repository
    
        # Build and push an image to ECR with inline caching.
        my-image:
            type: docker-build:Image
            properties:
                # Tag our image with our ECR repository's address.
                tags:
                    - ${ecr-repository.repositoryUrl}:latest
                context:
                    location: ./app
                # Use the pushed image as a cache source.
                cacheFrom:
                    - registry:
                        ref: ${ecr-repository.repositoryUrl}:latest
                # Include an inline cache with our pushed image.
                cacheTo:
                    - inline: {}
                # Build a multi-platform image manifest for ARM and AMD.
                platforms:
                    - linux/amd64
                    - linux/arm64
                # Push the final result to ECR.
                push: true
                # Provide our ECR credentials.
                registries:
                    - address: ${ecr-repository.repositoryUrl}
                      password: ${auth-token.password}
                      username: ${auth-token.userName}
    
    runtime: yaml
    variables:
        auth-token:
            # Grab auth credentials for ECR.
            fn::aws:ecr:getAuthorizationToken:
                registryId: ${ecr-repository.registryId}
    
    package myapp;
    
    import com.pulumi.Context;
    import com.pulumi.Pulumi;
    import com.pulumi.core.Output;
    import com.pulumi.aws.ecr.Repository;
    import com.pulumi.aws.ecr.EcrFunctions;
    import com.pulumi.aws.ecr.inputs.GetAuthorizationTokenArgs;
    import com.pulumi.dockerbuild.Image;
    import com.pulumi.dockerbuild.ImageArgs;
    import com.pulumi.dockerbuild.inputs.CacheFromArgs;
    import com.pulumi.dockerbuild.inputs.CacheFromRegistryArgs;
    import com.pulumi.dockerbuild.inputs.CacheToArgs;
    import com.pulumi.dockerbuild.inputs.CacheToInlineArgs;
    import com.pulumi.dockerbuild.inputs.BuildContextArgs;
    import com.pulumi.dockerbuild.inputs.RegistryArgs;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Map;
    import java.io.File;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    
    public class App {
        public static void main(String[] args) {
            Pulumi.run(App::stack);
        }
    
        public static void stack(Context ctx) {
            // Create an ECR repository for pushing.
            var ecrRepository = new Repository("ecrRepository");
    
            // Grab auth credentials for ECR.
            final var authToken = EcrFunctions.getAuthorizationToken(GetAuthorizationTokenArgs.builder()
                .registryId(ecrRepository.registryId())
                .build());
    
            // Build and push an image to ECR with inline caching.
            var myImage = new Image("myImage", ImageArgs.builder()
                // Tag our image with our ECR repository's address.
                .tags(ecrRepository.repositoryUrl().applyValue(repositoryUrl -> String.format("%s:latest", repositoryUrl)))
                .context(BuildContextArgs.builder()
                    .location("./app")
                    .build())
                // Use the pushed image as a cache source.
                .cacheFrom(CacheFromArgs.builder()
                    .registry(CacheFromRegistryArgs.builder()
                        .ref(ecrRepository.repositoryUrl().applyValue(repositoryUrl -> String.format("%s:latest", repositoryUrl)))
                        .build())
                    .build())
                // Include an inline cache with our pushed image.
                .cacheTo(CacheToArgs.builder()
                    .inline()
                    .build())
                // Build a multi-platform image manifest for ARM and AMD.
                .platforms(
                    "linux/amd64",
                    "linux/arm64")
                // Push the final result to ECR.
                .push(true)
                // Provide our ECR credentials.
                .registries(RegistryArgs.builder()
                    .address(ecrRepository.repositoryUrl())
                    .password(authToken.applyValue(getAuthorizationTokenResult -> getAuthorizationTokenResult).applyValue(authToken -> authToken.applyValue(getAuthorizationTokenResult -> getAuthorizationTokenResult.password())))
                    .username(authToken.applyValue(getAuthorizationTokenResult -> getAuthorizationTokenResult).applyValue(authToken -> authToken.applyValue(getAuthorizationTokenResult -> getAuthorizationTokenResult.userName())))
                    .build())
                .build());
    
            ctx.export("ref", myImage.ref());
        }
    }
    
    docker-build logo
    docker-build v0.0.2 published on Thursday, Apr 25, 2024 by Pulumi