📖 Scenario: You are working on a small web application that you want to deploy using Docker. To make your application image smaller and more secure, you decide to use a distroless image instead of a full Linux base image.Distroless images contain only the application and its runtime dependencies, without a package manager or shell. This reduces the image size and attack surface.
🎯 Goal: Build a Docker image for a simple Go web server using a distroless base image. You will create a Dockerfile that compiles the Go app and then uses a distroless image to run it.
📋 What You'll Learn
Create a Go source file named main.go with a simple HTTP server.
Write a multi-stage Dockerfile that first builds the Go app using the official Go image.
Use the gcr.io/distroless/base image as the final base image to run the compiled binary.
Expose port 8080 in the Dockerfile.
Run the Go binary as the container's entrypoint.
💡 Why This Matters
🌍 Real World
Distroless images are used in production to reduce Docker image size and improve security by removing unnecessary OS components.
💼 Career
Understanding distroless images is important for DevOps engineers and developers who want to optimize container images for cloud deployments.
Progress0 / 4 steps
1
Create the Go web server source file
Create a file named main.go with a simple HTTP server that listens on port 8080 and responds with "Hello, Distroless!" to any request.
Docker
Hint
Use the net/http package to create a simple web server. The handler should write "Hello, Distroless!" to the response.
2
Start the Dockerfile with the Go build stage
Create a Dockerfile that starts with the official Go image golang:1.20 as the build stage named builder. Copy main.go into the container and build the binary named app using go build -o app main.go.
Docker
Hint
Use a multi-stage build. The first stage uses golang:1.20. Set working directory to /app. Copy main.go and build the binary app.
3
Add the distroless base image and copy the binary
In the same Dockerfile, add a final stage that uses the distroless base image gcr.io/distroless/base. Copy the app binary from the builder stage to /app in the final image. Expose port 8080 and set the entrypoint to run /app.
Docker
Hint
The final image uses gcr.io/distroless/base. Copy the binary from the builder stage. Expose port 8080 and set the entrypoint to /app.
4
Build and run the Docker image
Build the Docker image with tag distroless-go using docker build -t distroless-go .. Then run the container mapping port 8080 with docker run -p 8080:8080 distroless-go. Finally, print the output of curl http://localhost:8080.
Docker
Hint
After building and running the container, use curl http://localhost:8080 to see the response. It should print "Hello, Distroless!".
Practice
(1/5)
1. What is the main advantage of using distroless images in Docker containers?
easy
A. They keep containers small and secure by including only necessary files
B. They include a full Linux distribution for easier debugging
C. They come with built-in shells and package managers
D. They automatically update the application inside the container
Solution
Step 1: Understand what distroless images contain
Distroless images include only the application and its runtime dependencies, excluding shells and package managers.
Step 2: Identify the benefit of minimal content
By including only what is needed, the image size is smaller and the attack surface is reduced, improving security.
Final Answer:
They keep containers small and secure by including only necessary files -> Option A
Quick Check:
Minimal content = Small and secure [OK]
Hint: Distroless means minimal, no shells or extras included [OK]
Common Mistakes:
Thinking distroless images have shells for debugging
Assuming they include full Linux distributions
Believing they auto-update applications
2. Which of the following is the correct way to specify a distroless base image in a Dockerfile?
easy
A. FROM ubuntu:latest
B. FROM alpine:3.15
C. FROM gcr.io/distroless/base
D. FROM node:distroless
Solution
Step 1: Identify official distroless image naming
Distroless images are hosted at gcr.io/distroless with names like 'base', 'static', or language-specific tags.
Step 2: Compare options to distroless naming
Only 'gcr.io/distroless/base' matches the official distroless image naming convention.
Final Answer:
FROM gcr.io/distroless/base -> Option C
Quick Check:
Official distroless images start with gcr.io/distroless [OK]
Hint: Distroless images start with gcr.io/distroless prefix [OK]
Common Mistakes:
Using common Linux distros like ubuntu or alpine as distroless
Assuming 'node:distroless' is a valid tag
Confusing distroless with minimal Linux images
3. Given this Dockerfile snippet using a distroless image:
FROM gcr.io/distroless/base
COPY app /app
CMD ["/app"]
What will happen if you try to run docker run and then execute sh inside the container?
medium
A. You will get a shell prompt because distroless images include shells
B. You will get an error saying 'sh: not found' because no shell is included
C. The container will crash immediately on start
D. The container will open a shell automatically
Solution
Step 1: Understand distroless image contents
Distroless images do not include shells or package managers, only the app and runtime.
5. You want to build a secure production Docker image for a Go app using distroless. Which multi-stage Dockerfile snippet correctly builds and runs the app with minimal image size and attack surface?
hard
A. FROM golang:1.20 AS build
WORKDIR /app
COPY . .
RUN go build -o app
FROM gcr.io/distroless/base
COPY --from=build /app/app /app
CMD ["/app"]
B. FROM golang:1.20
WORKDIR /app
COPY . .
RUN go build -o app
CMD ["./app"]
C. FROM alpine:latest
WORKDIR /app
COPY . .
RUN go build -o app
CMD ["./app"]
D. FROM gcr.io/distroless/base
COPY app /app
RUN go build -o app
CMD ["/app"]
Solution
Step 1: Understand multi-stage build for distroless
Build the Go app in a full image with build tools, then copy the binary into a minimal distroless image.
Step 2: Analyze options for correct multi-stage usage
Only FROM golang:1.20 AS build
WORKDIR /app
COPY . .
RUN go build -o app
FROM gcr.io/distroless/base
COPY --from=build /app/app /app
CMD ["/app"] uses golang image to build, then copies binary into distroless base image for runtime, minimizing size and attack surface.
Final Answer:
FROM golang:1.20 AS build
WORKDIR /app
COPY . .
RUN go build -o app
FROM gcr.io/distroless/base
COPY --from=build /app/app /app
CMD ["/app"] -> Option A
Quick Check:
Build in full image, run in distroless = secure minimal image [OK]
Hint: Build in full image, copy binary to distroless for runtime [OK]
Common Mistakes:
Trying to build inside distroless image (no build tools)
Using single-stage build with full image (larger size)
Using alpine without distroless for production
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.