Pulumi supports three operating systems, multiple programming languages, and almost 40 different providers. This means creating tooling that works effortlessly across all possible user scenarios can often throw unexpected challenges our way.
The [pulumi/pulumi Docker container](https://hub.docker.com/r/pulumi/pulumi) is almost 3Gb uncompressed, which is generally considered large for a Docker image.
Pulumi has the unique ability to interact with cloud providers across many boundaries. As an example, you might want to provision a Kubernetes cluster and install a Helm chart onto that cluster. Pulumi lets you do that from a single "Pulumi program", here's an example:
This list of requirements is already getting lengthy, and we're only provisioning one piece of infrastructure. Alongside this, if you're using this container in your CI/CD pipeline, you might _also_ need to acquire credentials during the pulumi up process. When you consider that Pulumi's users could be using _any_ of our featured programming languages as well as one or many of our supported cloud providers, you'll begin to imagine how many dependencies are needed.
To provide a seamless experience for our users, our existing [pulumi/pulumi Docker image](https://github.com/pulumi/pulumi-docker-containers) contains every possible dependency a user might need when provisioning cloud infrastructure. We install everything from the [Helm CLI](https://helm.sh/) to the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/get-started-with-azure-cli?view=azure-cli-latest) to ensure you can use the container for any Pulumi program. Unfortunately, as we began to support more cloud providers and more languages, the size of the image has grown considerably.
We've received [fantastic feedback from the community](https://github.com/pulumi/pulumi/issues/3789) that while this Docker image meets their needs, providing smaller images is desirable. Not only do our users want to see images that are smaller in size, but they also want a less opinionated image that provides the flexibility and customization needed to suit the complex workflows people can create with Pulumi.
Starting from Pulumi version 2.4.0, we'll be [publishing new, slimmer images in the DockerHub](https://hub.docker.com/u/pulumi) that contain fewer dependencies and are focused on individual specific languages. We've built these images to be usable from day 1, and many of our pioneering users have been using them successfully.
Each image contains everything you need to use Pulumi for your programming language of choice, including the Pulumi CLI, the Pulumi language runtime, and the language binary and dependency manager).
As you can see below, the uncompressed images are up to six times smaller than the pulumi/pulumi container, which means a much smaller surface area and considerably quicker pull times.
Using the new Pulumi images looks very similar to how you might use the CLI locally. Here's an example of running Pulumi for a typescript project, and the Pulumi SaaS backend:
```bash
docker run -e PULUMI_ACCESS_TOKEN=<PULUMI_ACCESS_TOKEN> -v "$(pwd)":/pulumi/projects pulumi-nodejs:latest /bin/bash -c "npm ci && pulumi preview -s dev"
```
If you're using one of our cloud backends, you'll need to specify your cloud provider credentials and login to your selected backend:
Pulumi's intelligent plugin acquisition should find and detect the required resource plugins so you can run your Pulumi program.
If you need additional CLI tools like Helm as part of your workflow, we recommend installing these tools as part of your CI/CD pipeline or using these images as a base image to build your own Docker images. Here's an example of installing Helm in our Go-based Docker image.
The default operating system for these new images is [Debian Buster](https://www.debian.org/releases/buster/), but we also publish Images based on [RedHat's Universal Base Image](https://access.redhat.com/articles/4238681). These images are small and lightweight but also benefit from RedHat's exceptional security focus. We scanned these images with [synk.io](https://snyk.io) and found zero vulnerabilities, which should provide peace of mind when running these Pulumi images.
Many users are fans of [Alpine Linux's](https://alpinelinux.org/) small, lightweight footprint and its Docker focused design; however, we've made the decision not to publish Alpine based images at this moment.
Alpine's usage of [musl libc](https://alpinelinux.org/posts/Alpine-Linux-has-switched-to-musl-libc.html) rather than [glibc](https://www.gnu.org/software/libc/) means that Pulumi doesn't run without adding additional dependencies, which made it hard to justify introducing this extra source of potential bugs into our already broad surface area.
If you're interested in building and maintaining an Alpine based Pulumi image, we have skeleton Docker files available in the [Pulumi GitHub repo](https://github.com/pulumi/pulumi/tree/master/docker).
The new images are available from [DockerHub](https://hub.docker.com/u/pulumi); we'd love for you to give them a try! As always, if you find any issues, don't hesitate to open an [issue](https://github.com/pulumi/pulumi/issues)!