Need help with distroless?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

10.8K Stars 605 Forks Apache License 2.0 638 Commits 87 Opened issues


🥑 Language focused docker images, minus the operating system.

Services available


Need anything else?

Contributors list

"Distroless" Docker Images

CI Build Status

"Distroless" images contain only your application and its runtime dependencies. They do not contain package managers, shells or any other programs you would expect to find in a standard Linux distribution.

For more information, see this talk (video).

Why should I use distroless images?

Restricting what's in your runtime container to precisely what's necessary for your app is a best practice employed by Google and other tech giants that have used containers in production for many years. It improves the signal to noise of scanners (e.g. CVE) and reduces the burden of establishing provenance to just what you need.

Distroless images are very small. The smallest distroless image,
, is around 650 kB. That's about 25% of the size of
(~2.5 MB), and less than 1.5% of the size of
(50 MB).

For example,
is a container image that's much smaller than this image of a shipping container. It's about 1/3rd the size of all the resources on this page you're reading right now. It's very small.

How do I use distroless images?

These images are built using the bazel tool, but they can also be used through other Docker image build tooling.

How do I verify distroless images?

All distroless images are signed by cosign. We recommend verifying any distroless image you use before building your image.

Once you've installed cosign, you can use the distroless public key to verify any distroless image with:

-----END PUBLIC KEY-----

cosign verify -key $IMAGE_NAME


Note that distroless images by default do not contain a shell. That means the Dockerfile

command, when defined, must be specified in
form, to avoid the container runtime prefixing with a shell.

This works:

ENTRYPOINT ["myapp"]

But this does not work:


For the same reasons, if the entrypoint is left to the default empty vector, the CMD command should be specified in

form (see examples below).


Docker multi-stage builds make using distroless images easy. Follow these steps to get started:

The basic idea is that you'll have one stage to build your application artifacts, and insert them into your runtime distroless image. If you'd like to learn more, please see the documentation on multi-stage builds.

Examples with Docker

Here's a quick example for go:

  # Start by building the application.
  FROM golang:1.13-buster as build

WORKDIR /go/src/app ADD . /go/src/app

RUN go get -d -v ./...

RUN go build -o /go/bin/app

Now copy it into our base image.

FROM COPY --from=build /go/bin/app / CMD ["/app"]

You can find other examples here:

To run any example, go to the directory for the language and run

docker build -t myapp .
docker run -t myapp
To run the Node.js Express app node-express and expose the container's ports:
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp

This should expose the Express application to your localhost:3000


For full documentation on how to use bazel to generate Docker images, see the bazelbuild/rules_docker repository.

For documentation and examples on how to use the bazel package manager rules, see ./package_manager

Examples can be found in this repository in the examples directory.

Examples with Bazel

We have some examples on how to run some common application stacks in the /examples directory. See here for:

See here for examples on how to complete some common tasks in your image:

See here for more information on how these images are built and released.


For full documentation on how to use Jib to generate Docker images from Maven and Gradle, see the GoogleContainerTools/jib repository.

Base Operating System

Distroless images are based on Debian 10 (buster). Originally these images were based on Debian 9 (stretch), but those images (anything tagged with

) are deprecated and no longer supported. Images are explicitly tagged with
suffixes. Specifying an image without the distribution will currently select
images, but that can change in the future to a newer version of Debian. It can be useful to reference the appropriate distribution explicitly, to prevent a breakage when the next Debian version is released.

CVE and Patching

Distroless tracks Debian 10. A commit is needed in this repository to update the snapshot version when security fixes are release. Check for any patches to address security issues and update. Check issues and PRs for the patch and update your builds.

Debug Images

Distroless images are minimal and lack shell access. The

image set for each language provides a busybox shell to enter.

For example:

cd examples/python3/

edit the

to change the final image to
COPY . /app
CMD ["", "/etc"]

then build and launch with an shell entrypoint:

$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image

/app # ls BUILD Dockerfile

Note: If the image you are using already has a tag, for example
, use the tag
instead, for example

Note: ldd is not installed in the base image as it's a shell script, you can copy it in or download it.

Who uses Distroless?

If your project uses Distroless, send a PR to add your project here!

Community Discussion

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.