Running BuildKit in rootless mode increases your security and flexibility when building container images, especially on multi-user systems or CI environments where root privileges are restricted. This method uses a dedicated user and systemd service for isolation and automation, ensuring clean operation without elevated permissions. Docker is installed to provide a familiar runtime for container operations, while RootlessKit bridges the gap needed for rootless containerization.

Prerequisites#

  • Ubuntu (24.04+, fresh or existing)
  • Sudo privileges

Installation Steps#

1. Download and Extract BuildKit#

Download the BuildKit tarball and extract it to /opt/buildkit:

sudo mkdir -p /opt/buildkit
cd /opt/buildkit
sudo wget https://github.com/moby/buildkit/releases/download/v0.25.0/buildkit-v0.25.0.linux-amd64.tar.gz
sudo tar --strip-components=1 -xzvf buildkit-v0.25.0.linux-amd64.tar.gz

This will place BuildKit binaries into /opt/buildkit, making them accessible for your dedicated user and service.

2. Install Docker#

Update your repositories and install Docker from the official Docker repository:

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce

Docker provides the runtime that BuildKit can use when building container images.

3. Create BuildKit User#

Create a system user to run BuildKit with minimal permissions:

sudo adduser buildkituser --disabled-password --gecos ""

This user will only be used for BuildKit processes, keeping your system secure and clean.

4. Install RootlessKit#

Install RootlessKit, which is required to run BuildKit in rootless mode:

sudo apt install -y rootlesskit

RootlessKit helps simulate root privileges for BuildKit without requiring actual root access.

5. Create BuildKit Systemd Service and config#

Create BuildKit config at /opt/buildkit/buildkitd.toml

[worker.oci]
  # Specify the directory for the cache (optional)
  # cache = "/opt/buildkit/cache"

[grpc]
  addr = "unix:///opt/buildkit/buildkit.sock"

Create the BuildKit system service file at /etc/systemd/system/buildkit.service:

[Unit]
Description=BuildKit
After=network.target

[Service]
User=buildkituser
ExecStart=/usr/bin/rootlesskit /opt/buildkit/bin/buildkitd --rootless --config /opt/buildkit/buildkitd.toml --addr unix:///opt/buildkit/buildkit.sock --otel-socket-path /opt/buildkit/otel-grpc.sock
Restart=always
WorkingDirectory=/opt/buildkit
Environment=HOME=/home/buildkituser

[Install]
WantedBy=default.target

This ensures BuildKit starts as a dedicated, rootless service on boot, isolated from other processes.

6. Enable and Start the Service#

Reload systemd, enable the service, and start it:

sudo systemctl daemon-reload
sudo systemctl enable buildkit
sudo systemctl start buildkit

Verify the status:

sudo systemctl status buildkit

Example Usage#

Once running, you can build images using BuildKit’s client:

/opt/buildkit/bin/buildctl --addr unix:///opt/buildkit/buildkit.sock build --frontend dockerfile.v0 --local context=. --local dockerfile=.

This command builds a Dockerfile in your current directory using BuildKit’s rootless service.


Running BuildKit as rootless with a dedicated user and systemd service is ideal for secure CI/CD pipelines, developer environments, and production systems. You gain improved isolation and increased safety, making container builds more robust and easier to audit.