Skip to content

Bare Container Base Images

Prerequisites

Before starting, you'll need:

  • A container runtime: Podman or Docker
  • Familiarity with Containerfile or Dockerfile syntax
  • For bare images with pip/npm dependencies: basic understanding of multi-stage builds

TIP

This guide uses podman commands throughout. If you use Docker, replace podman with docker — the commands are interchangeable.

Choosing an Image

Choose an image by looking at the Garden Linux Container Image Reference.

TIP

Bare images intentionally omit basic utilities like sh. For debugging, see the Debug a Bare Container section below.

bare-libc: C/C++ Applications

Use bare-libc for compiled applications that require only the C library:

dockerfile
# Build stage: compile the application
FROM gcc:bookworm AS compile
COPY source.c /
RUN gcc -O2 -o myapp source.c

# Production stage: copy the compiled binary into the bare image
FROM ghcr.io/gardenlinux/gardenlinux/bare-libc:2150.0.0
COPY --from=compile /myapp /
CMD [ "/myapp" ]

bare-python: Python Applications

Use bare-python for Python applications. The image includes Python but not pip:

dockerfile
FROM ghcr.io/gardenlinux/gardenlinux/bare-python:2150.0.0
COPY hello.py /
CMD [ "python3", "/hello.py" ]

Adding Python Dependencies

Since bare-python lacks pip, use a multi-stage build with the container-python-dev image to install dependencies, then copy them into the bare image:

dockerfile
# Build stage: install dependencies
FROM ghcr.io/gardenlinux/gardenlinux/container-python-dev:2150.0.0 AS packages
COPY requirements.txt /
RUN pip3 install -r requirements.txt --break-system-packages --no-cache-dir
RUN exportLibs.py

# Production stage: copy dependencies into bare image
FROM ghcr.io/gardenlinux/gardenlinux/bare-python:2150.0.0
COPY --from=packages /usr/local/lib/python3.13/dist-packages/ /usr/local/lib/python3.13/dist-packages/
COPY --from=packages /required_libs /
COPY main.py /
ENTRYPOINT [ "python3", "/main.py" ]

The exportLibs.py script traces shared library dependencies of pip-installed packages and copies them to /required_libs for the production stage.

bare-nodejs: Node.js Applications

Use bare-nodejs for Node.js applications:

dockerfile
FROM ghcr.io/gardenlinux/gardenlinux/bare-nodejs:2150.0.0
COPY index.js /
CMD [ "node", "/index.js" ]

For applications with npm dependencies, use a multi-stage build similar to the Python example, using a Node.js development image in the first stage.

bare-sapmachine: Java/SAP Applications

Use bare-sapmachine for Java applications using SAPMachine:

dockerfile
# Build stage: compile Java application
FROM docker.io/library/sapmachine:latest AS compile
COPY Test.java /
RUN javac Test.java && jar -c -f test.jar -e Test Test.class

# Production stage: copy JAR into bare image
FROM ghcr.io/gardenlinux/gardenlinux/bare-sapmachine:2150.0.0
COPY --from=compile /test.jar /
CMD [ "java", "-jar", "/test.jar" ]

Debug a Bare Container

If a setup works in the normal container, but fails in the corresponding bare container, debugging the problem can get challenging, as the unbase_oci tool removes basic binaries like sh. By following the steps in this section, you can regain the basic functionalities without rebuilding the image.

Step 1: Pull and Mount the Image

As the first step, we want to mount the bare image to a debian installation. As mounting does not automatically pull the image, we pull it manually:

bash
podman pull ghcr.io/gardenlinux/gardenlinux/bare-python:2150.0.0
podman run --rm -it \
    --mount type=image,src=ghcr.io/gardenlinux/gardenlinux/bare-python:2150.0.0,dst=/mnt,rw=true \
    debian

You are now in a Debian shell with the bare image accessible at /mnt.

Step 2: Enter the Bare Image

Run commands inside the bare image using chroot:

bash
chroot /mnt <command>

Step 3: Install Basic Utilities

To spawn a shell inside the bare image, install toybox, which provides many CLI utilities in a single binary:

bash
apt update && apt install curl -y
curl http://landley.net/bin/toybox/latest/toybox-$(uname -m) -o /mnt/bin/toybox
chmod +x /mnt/bin/toybox

Now you can spawn a shell:

bash
chroot /mnt toybox sh

Step 4: Analyze Image Size

Bare images may unexpectedly grow. To find the cause of the issue, we can install tools to the debian container and use them on the /mnt folder.

bash
apt update && apt install du-dust
dust -n 32 -w 64 -r /mnt
 52M └─┬ mnt                        │████████████████████ 100%
 52M   └─┬ usr                      │████████████████████ 100%
 43M     ├─┬ lib                    │█████████████████░░░  82%
 28M ├─┬ python3.13           │███████████▒▒▒▒▒▒░░░  55%
5.2M ├── lib-dynload        │██▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░  10%
5.2M ├── __pycache__        │██▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░  10%
2.4M ├─┬ encodings          │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   5%
780K └── __pycache__      │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
1.5M ├─┬ test               │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   3%
768K ├── support          │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
520K └── libregrtest      │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
1.3M ├─┬ asyncio            │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   2%
732K └── __pycache__      │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
1.0M ├─┬ pydoc_data         │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   2%
524K └── __pycache__      │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
964K ├── email              │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   2%
776K ├── multiprocessing    │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
772K ├── xml                │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
616K ├── importlib          │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
608K ├── unittest           │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
540K └── _pyrepl            │█▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░   1%
 14M └─┬ aarch64-linux-gnu    │██████▒▒▒▒▒▒▒▒▒▒▒░░░  27%
5.8M   ├── libcrypto.so.3     │███▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░░  11%
1.7M   ├── libc.so.6          │█▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░░   3%
1.6M   ├── libsqlite3.so.0.8.6│█▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░░   3%
1.1M   ├── libssl.so.3        │█▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░░   2%
708K   ├── libzstd.so.1.5.7   │█▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░░   1%
580K   └── libm.so.6          │█▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░░   1%
7.0M     ├─┬ bin                    │███░░░░░░░░░░░░░░░░░  13%
6.9M └── python3.13           │███░░░░░░░░░░░░░░░░░  13%
2.4M     └─┬ share                  │█░░░░░░░░░░░░░░░░░░░   5%
1.9M       └─┬ zoneinfo             │█░░░░░░░░░░░░░░░░░░░   4%
572K         └── America            │█░░░░░░░░░░░░░░░░░░░   1%

This shows which directories consume the most space, helping identify unnecessary files.

Further Reading