Provided by: distrobox_1.8.1.2-1_all 

NAME
distrobox assemble
distrobox-assemble
DESCRIPTION
distrobox-assemble takes care of creating or destroying containers in batches, based on a manifest file.
The manifest file by default is ./distrobox.ini, but can be specified using the --file flag.
SYNOPSIS
distrobox assemble
--file: path or URL to the distrobox manifest/ini file
--name/-n: run against a single entry in the manifest/ini file
--replace/-R: replace already existing distroboxes with matching names
--dry-run/-d: only print the container manager command generated
--verbose/-v: show more verbosity
--version/-V: show version
EXAMPLES
This is an example manifest file to create two containers:
[ubuntu]
additional_packages="git vim tmux nodejs"
image=ubuntu:latest
init=false
nvidia=false
pull=true
root=false
replace=true
start_now=false
# You can add comments using this #
[arch] # also inline comments are supported
additional_packages="git vim tmux nodejs"
home=/tmp/home
image=archlinux:latest
init=false
start_now=true
init_hooks="touch /init-normal"
nvidia=true
pre_init_hooks="touch /pre-init"
pull=true
root=false
replace=false
volume="/tmp/test:/run/a /tmp/test:/run/b"
Create
We can bring them up simply using
distrobox assemble create
If the file is called distrobox.ini and is in the same directory you’re launching the command, no further
arguments are needed. You can specify a custom path for the file using
distrobox assemble create --file /my/custom/path.ini
Or even specify a remote file, by using an URL:
distrobox-assemble create --file https://raw.githubusercontent.com/89luca89/dotfiles/master/distrobox.ini
Replace
By default, distrobox assemble will replace a container only if replace=true is specified in the manifest
file.
In the example of the manifest above, the ubuntu container will always be replaced when running distrobox
assemble create, while the arch container will not.
To force a replace for all containers in a manifest use the --replace flag
distrobox assemble create --replace [--file my/custom/path.ini]
Remove
We can bring down all the containers in a manifest file by simply doing
distrobox assemble rm
Or using a custom path for the ini file
distrobox assemble rm --file my/custom/path.ini
Test
You can always test what distrobox would do by using the --dry-run flag. This command will only print
what commands distrobox would do without actually running them.
Clone
Disclaimer: You need to start the container once to ensure it is fully initialized and created before
cloning it. The container being copied must also be stopped before the cloning process can proceed.
Available options
This is a list of available options with the corresponding type:
Types legend:
• bool: true or false
• string: a single string, for example home="/home/luca-linux/dbox"
• string_list: multiple strings, for example additional_packages="htop vim git". Note that string_list
can be declared multiple times to be compounded:
[ubuntu]
image=ubuntu:latest
additional_packages="git vim tmux nodejs"
additional_packages="htop iftop iotop"
additional_packages="zsh fish"
Flag Name Type
─────────────────────────────────────────────────────────────────────────────
additional_flags string_list Additional flags to
pass to the container
manager
additional_packages string_list Additional packages to
install inside the
container
home string Which home directory
should the container
use
image string Which image should the
container use, look
here for a list
clone string Name of the Distrobox
container to use as the
base for a new
container (the
container must be
stopped).
init_hooks string_list Commands to run inside
the container, after
the packages setup
pre_init_hooks string_list Commands to run inside
the container, before
the packages setup
volume string_list Additional volumes to
mount inside the
containers
exported_apps string_list App names or
desktopfile paths to
export
exported_bins string_list Binaries to export
exported_bins_path string Optional path where to
export binaries
(default:
$HOME/.local/bin)
entry bool Generate an entry for
the container in the
app list (default:
false)
start_now bool Start the container
immediately (default:
false)
init bool Specify if this is an
initful container
(default: false)
nvidia bool Specify if you want to
enable NVidia drivers
integration (default:
false)
pull bool Specify if you want to
pull the image every
time (default: false)
root bool Specify if the
container is rootful
(default: false)
unshare_ipc bool Specify if the
container should
unshare the ipc
namespace (default:
false)
unshare_netns bool Specify if the
container should
unshare the network
namespace (default:
false)
unshare_process bool Specify if the
container should
unshare the process
(pid) namespace
(default: false)
unshare_devsys bool Specify if the
container should
unshare /dev (default:
false)
unshare_all bool Specify if the
container should
unshare all the
previous options
(default: false)
For further explanation of each of the option in the list, take a look at the distrobox create usage,
each option corresponds to one of the create flags.
Advanced example
[tumbleweed_distrobox]
image=registry.opensuse.org/opensuse/distrobox
pull=true
additional_packages="acpi bash-completion findutils iproute iputils sensors inotify-tools unzip"
additional_packages="net-tools nmap openssl procps psmisc rsync man tig tmux tree vim htop xclip yt-dlp"
additional_packages="git git-credential-libsecret"
additional_packages="patterns-devel-base-devel_basis"
additional_packages="ShellCheck ansible-lint clang clang-tools codespell ctags desktop-file-utils gcc golang jq python3"
additional_packages="python3-bashate python3-flake8 python3-mypy python3-pipx python3-pycodestyle python3-pyflakes python3-pylint python3-python-lsp-server python3-rstcheck python3-yapf python3-yamllint rustup shfmt"
additional_packages="kubernetes-client helm"
init_hooks=GOPATH="${HOME}/.local/share/system-go" GOBIN=/usr/local/bin go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest;
init_hooks=GOPATH="${HOME}/.local/share/system-go" GOBIN=/usr/local/bin go install github.com/onsi/ginkgo/v2/ginkgo@latest;
init_hooks=GOPATH="${HOME}/.local/share/system-go" GOBIN=/usr/local/bin go install golang.org/x/tools/cmd/goimports@latest;
init_hooks=GOPATH="${HOME}/.local/share/system-go" GOBIN=/usr/local/bin go install golang.org/x/tools/gopls@latest;
init_hooks=GOPATH="${HOME}/.local/share/system-go" GOBIN=/usr/local/bin go install sigs.k8s.io/kind@latest;
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/conmon;
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/crun;
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/docker;
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/docker-compose;
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/flatpak;
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/podman;
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/xdg-open;
exported_apps="htop"
exported_bins="/usr/bin/htop /usr/bin/git"
exported_bins_path="~/.local/bin"
Clone example
[ubuntu]
additional_packages="git vim tmux"
image=ubuntu:latest
init=false
nvidia=false
pull=true
root=false
replace=true
start_now=true
[deno_ubuntu]
clone=ubuntu
init=false
nvidia=false
pull=true
root=false
replace=true
start_now=true
pre_init_hooks=curl -fsSL https://deno.land/install.sh | sh;
[bun_ubuntu]
clone=ubuntu
init=false
nvidia=false
pull=true
root=false
replace=true
start_now=true
pre_init_hooks=curl -fsSL https://bun.sh/install | bash;
Distrobox Jan 2025 DISTROBOX-ASSEMBLE(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX(1) User Manual DISTROBOX(1)
COMPATIBILITY
This project does not need a dedicated image. It can use any OCI images from docker-hub, quay.io, or any
registry of your choice.
Many cloud images are stripped down on purpose to save size and may not include commands such as which,
mount, less or vi). Additional packages can be installed once inside the container. We recommend using
your preferred automation tool inside the container if you find yourself having to repeatedly create new
containers. Maintaining your own custom image is also an option.
The main concern is having basic Linux utilities (mount), basic user management utilities (usermod,
passwd), and sudo correctly set.
SUPPORTED CONTAINER MANAGERS
distrobox can run on either podman, docker or lilipod
It depends either on podman configured in rootless mode or on docker configured without sudo (follow
THESE instructions)
• Minimum podman version: 2.1.0
• Minimum docker client version: 19.03.15
• Minimum lilipod version: v0.0.1
Follow the official installation guide here:
• https://podman.io/getting-started/installation
• https://docs.docker.com/engine/install
• https://docs.docker.com/engine/install/linux-postinstall/
CONTAINERS DISTROS
Distrobox guests tested successfully with the following container images:
Distro Version Images
──────────────────────────────────────────────────────────────────────────────────────────────────────────────
AlmaLinux (Toolbox) 8 9 quay.io/toolbx-images/almalinux-toolbox:8
quay.io/toolbx-images/almalinux-toolbox:9
quay.io/toolbx-images/almalinux-toolbox:latest
Alpine (Toolbox) 3.16 3.17 3.18 3.19 quay.io/toolbx-images/alpine-toolbox:3.16
3.20 edge quay.io/toolbx-images/alpine-toolbox:3.17
quay.io/toolbx-images/alpine-toolbox:3.18
quay.io/toolbx-images/alpine-toolbox:3.19
quay.io/toolbx-images/alpine-toolbox:3.20
quay.io/toolbx-images/alpine-toolbox:edge
quay.io/toolbx-images/alpine-toolbox:latest
AmazonLinux (Toolbox) 2 2022 quay.io/toolbx-images/amazonlinux-toolbox:2
quay.io/toolbx-images/amazonlinux-toolbox:2023
quay.io/toolbx-images/amazonlinux-toolbox:latest
Archlinux (Toolbox) quay.io/toolbx/arch-toolbox:latest
Bazzite Arch ghcr.io/ublue-os/bazzite-arch:latest
ghcr.io/ublue-os/bazzite-arch-gnome:latest
Centos (Toolbox) stream8 stream9 quay.io/toolbx-images/centos-toolbox:stream8
quay.io/toolbx-images/centos-toolbox:stream9
quay.io/toolbx-images/centos-toolbox:latest
Debian (Toolbox) 10 11 12 testing quay.io/toolbx-images/debian-toolbox:10
unstable quay.io/toolbx-images/debian-toolbox:11
quay.io/toolbx-images/debian-toolbox:12
quay.io/toolbx-images/debian-toolbox:testing
quay.io/toolbx-images/debian-toolbox:unstable
quay.io/toolbx-images/debian-toolbox:latest
Fedora (Toolbox) 37 38 39 40 41 registry.fedoraproject.org/fedora-toolbox:37
Rawhide registry.fedoraproject.org/fedora-toolbox:38
registry.fedoraproject.org/fedora-toolbox:39
registry.fedoraproject.org/fedora-toolbox:40
quay.io/fedora/fedora-toolbox:41
quay.io/fedora/fedora-toolbox:rawhide
openSUSE (Toolbox) registry.opensuse.org/opensuse/distrobox:latest
RedHat (Toolbox) 8 9 registry.access.redhat.com/ubi8/toolbox
registry.access.redhat.com/ubi9/toolbox
Rocky Linux (Toolbox) 8 9 quay.io/toolbx-images/rockylinux-toolbox:8
quay.io/toolbx-images/rockylinux-toolbox:9
quay.io/toolbx-images/rockylinux-toolbox:latest
Ubuntu (Toolbox) 16.04 18.04 20.04 quay.io/toolbx/ubuntu-toolbox:16.04
22.04 24.04 quay.io/toolbx/ubuntu-toolbox:18.04
quay.io/toolbx/ubuntu-toolbox:20.04
quay.io/toolbx/ubuntu-toolbox:22.04
quay.io/toolbx/ubuntu-toolbox:24.04
quay.io/toolbx/ubuntu-toolbox:latest
Chainguard Wolfi quay.io/toolbx-images/wolfi-toolbox:latest
(Toolbox)
Ublue bluefin-cli ghcr.io/ublue-os/bluefin-cli
ubuntu-toolbox ghcr.io/ublue-os/bluefin-cli
fedora-toolbox ghcr.io/ublue-os/ubuntu-toolbox
wolfi-toolbox ghcr.io/ublue-os/fedora-toolbox
archlinux-distrobox ghcr.io/ublue-os/wolfi-toolbox
powershell-toolbox ghcr.io/ublue-os/arch-distrobox
ghcr.io/ublue-os/powershell-toolbox
AlmaLinux 8 8-minimal 9 docker.io/library/almalinux:8
9-minimal docker.io/library/almalinux:9
Alpine Linux 3.15 3.16 3.17 3.18 docker.io/library/alpine:3.15
3.19 3.20 edge docker.io/library/alpine:3.16
docker.io/library/alpine:3.17
docker.io/library/alpine:3.18
docker.io/library/alpine:3.19
docker.io/library/alpine:3.20
docker.io/library/alpine:edge
docker.io/library/alpine:latest
AmazonLinux 1 2 2023 public.ecr.aws/amazonlinux/amazonlinux:1
public.ecr.aws/amazonlinux/amazonlinux:2
public.ecr.aws/amazonlinux/amazonlinux:2023
Archlinux docker.io/library/archlinux:latest
Blackarch docker.io/blackarchlinux/blackarch:latest
CentOS Stream 8 9 quay.io/centos/centos:stream8
quay.io/centos/centos:stream9
Chainguard Wolfi cgr.dev/chainguard/wolfi-base:latest
ClearLinux docker.io/library/clearlinux:latest
docker.io/library/clearlinux:base
Crystal Linux registry.gitlab.com/crystal-linux/misc/docker:latest
Debian 7 8 9 10 11 12 docker.io/debian/eol:wheezy
docker.io/library/debian:buster
docker.io/library/debian:bullseye-backports
docker.io/library/debian:bookworm-backports
docker.io/library/debian:stable-backports
Debian Testing docker.io/library/debian:testing
docker.io/library/debian:testing-backports
Debian Unstable docker.io/library/debian:unstable
deepin 20 (apricot) 23 docker.io/linuxdeepin/apricot
(beige) docker.io/linuxdeepin/deepin:beige
Fedora 36 37 38 39 40 41 quay.io/fedora/fedora:36 quay.io/fedora/fedora:37
Rawhide quay.io/fedora/fedora:38 quay.io/fedora/fedora:39
quay.io/fedora/fedora:40 quay.io/fedora/fedora:41
quay.io/fedora/fedora:rawhide
Gentoo Linux rolling docker.io/gentoo/stage3:latest
KDE neon Latest invent-registry.kde.org/neon/docker-images/plasma:latest
Kali Linux rolling docker.io/kalilinux/kali-rolling:latest
Mint 21.1 docker.io/linuxmintd/mint21.1-amd64
Neurodebian nd100 docker.io/library/neurodebian:nd100
openSUSE Leap registry.opensuse.org/opensuse/leap:latest
openSUSE Tumbleweed registry.opensuse.org/opensuse/distrobox:latest
registry.opensuse.org/opensuse/tumbleweed:latest
registry.opensuse.org/opensuse/toolbox:latest
Oracle Linux 7 7-slim 8 8-slim 9 container-registry.oracle.com/os/oraclelinux:7
9-slim container-registry.oracle.com/os/oraclelinux:7-slim
container-registry.oracle.com/os/oraclelinux:8
container-registry.oracle.com/os/oraclelinux:8-slim
container-registry.oracle.com/os/oraclelinux:9
container-registry.oracle.com/os/oraclelinux:9-slim
RedHat (UBI) 7 8 9 registry.access.redhat.com/ubi7/ubi
registry.access.redhat.com/ubi8/ubi
registry.access.redhat.com/ubi8/ubi-init
registry.access.redhat.com/ubi8/ubi-minimal
registry.access.redhat.com/ubi9/ubi
registry.access.redhat.com/ubi9/ubi-init
registry.access.redhat.com/ubi9/ubi-minimal
Rocky Linux 8 8-minimal 9 quay.io/rockylinux/rockylinux:8
quay.io/rockylinux/rockylinux:8-minimal
quay.io/rockylinux/rockylinux:9
quay.io/rockylinux/rockylinux:latest
Slackware docker.io/vbatts/slackware:current
SteamOS ghcr.io/linuxserver/steamos:latest
Ubuntu 14.04 16.04 18.04 docker.io/library/ubuntu:14.04
20.04 22.04 24.04 docker.io/library/ubuntu:16.04
docker.io/library/ubuntu:18.04
docker.io/library/ubuntu:20.04
docker.io/library/ubuntu:22.04
docker.io/library/ubuntu:24.04
Vanilla OS VSO ghcr.io/vanilla-os/vso:main
Void Linux glibc musl ghcr.io/void-linux/void-glibc-full:latest
ghcr.io/void-linux/void-musl-full:latest
Images marked with Toolbox are tailored images made by the community efforts in toolbx-images/images, so
they are more indicated for desktop use, and first setup will take less time. Note however that if you
use a non-toolbox preconfigured image, the first distrobox-enter you’ll perform can take a while as it
will download and install the missing dependencies.
A small time tax to pay for the ability to use any type of image. This will not occur after the first
time, subsequent enters will be much faster.
NixOS is not a supported container distro, and there are currently no plans to bring support to it. If
you are looking for unprivileged NixOS environments, we suggest you look into nix-shell or nix portable
NEW DISTRO SUPPORT
If your distro of choice is not on the list, open an issue requesting support for it, we can work
together to check if it is possible to add support for it.
Or just try using it anyway, if it works, open an issue and it will be added to the list!
OLDER DISTRIBUTIONS
For older distributions like CentOS 5, CentOS 6, Debian 6, Ubuntu 12.04, compatibility is not assured.
Their libc version is incompatible with kernel releases after >=4.11. A work around this is to use the
vsyscall=emulate flag in the bootloader of the host.
Keep also in mind that mirrors could be down for such old releases, so you will need to build a custom
distrobox image to ensure basic dependencies are met.
GPU ACCELERATION SUPPORT
For Intel and AMD Gpus, the support is baked in, as the containers will install their latest available
mesa/dri drivers.
For NVidia, you can use the --nvidia flag during create, see distrobox-create documentation to discover
how to use it.
Alternatively, you can use the nvidia-container-toolkit utility to set up the integration independently
from the distrobox’s own flag.
Distrobox Jan 2025 DISTROBOX(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-CREATE(1) User Manual DISTROBOX-CREATE(1)
NAME
distrobox create
distrobox-create
DESCRIPTION
distrobox-create takes care of creating the container with input name and image. The created container
will be tightly integrated with the host, allowing sharing of the HOME directory of the user, external
storage, external usb devices and graphical apps (X11/Wayland), and audio.
SYNOPSIS
distrobox create
--image/-i: image to use for the container default: ${container_image_default}
--name/-n: name for the distrobox default: ${container_name_default}
--hostname: hostname for the distrobox default: <container-name>.$(uname -n)
--pull/-p: pull the image even if it exists locally (implies --yes)
--yes/-Y: non-interactive, pull images without asking
--root/-r: launch podman/docker/lilipod with root privileges. Note that if you need root this is the preferred
way over "sudo distrobox" (note: if using a program other than 'sudo' for root privileges is necessary,
specify it through the DBX_SUDO_PROGRAM env variable, or 'distrobox_sudo_program' config variable)
--clone/-c: name of the distrobox container to use as base for a new container
this will be useful to either rename an existing distrobox or have multiple copies
of the same environment.
--home/-H: select a custom HOME directory for the container. Useful to avoid host's home littering with temp files.
--volume: additional volumes to add to the container
--additional-flags/-a: additional flags to pass to the container manager command
--additional-packages/-ap: additional packages to install during initial container setup
--init-hooks: additional commands to execute at the end of container initialization
--pre-init-hooks: additional commands to execute at the start of container initialization
--init/-I: use init system (like systemd) inside the container.
this will make host's processes not visible from within the container. (assumes --unshare-process)
may require additional packages depending on the container image: https://github.com/89luca89/distrobox/blob/main/docs/useful_tips.md#using-init-system-inside-a-distrobox
--nvidia: try to integrate host's nVidia drivers in the guest
--platform: specify which platform to use, eg: linux/arm64
--unshare-devsys: do not share host devices and sysfs dirs from host
--unshare-groups: do not forward user's additional groups into the container
--unshare-ipc: do not share ipc namespace with host
--unshare-netns: do not share the net namespace with host
--unshare-process: do not share process namespace with host
--unshare-all: activate all the unshare flags below
--compatibility/-C: show list of compatible images
--help/-h: show this message
--no-entry: do not generate a container entry in the application list
--dry-run/-d: only print the container manager command generated
--verbose/-v: show more verbosity
--version/-V: show version
--absolutely-disable-root-password-i-am-really-positively-sure: ⚠️ ⚠️ when setting up a rootful distrobox, this will skip user password setup, leaving it blank. ⚠️ ⚠️
COMPATIBILITY
for a list of compatible images and container managers, please consult the man page:
man distrobox
man distrobox-compatibility
or consult the documentation page on: https://github.com/89luca89/distrobox/blob/main/docs/compatibility.md#containers-distros
EXAMPLES
Create a distrobox with image alpine, called my-alpine container
distrobox create --image alpine my-alpine-container
Create a distrobox from fedora-toolbox:35 image
distrobox create --image registry.fedoraproject.org/fedora-toolbox:35 --name fedora-toolbox-35
Clone an existing distrobox container
distrobox create --clone fedora-35 --name fedora-35-copy
Always pull for the new image when creating a distrobox
distrobox create --pull --image centos:stream9 --home ~/distrobox/centos9
Add additional environment variables to the container
distrobox create --image fedora:35 --name test --additional-flags "--env MY_VAR=value"
Add additional volumes to the container
distrobox create --image fedora:35 --name test --volume /opt/my-dir:/usr/local/my-dir:rw --additional-flags "--pids-limit -1"
Add additional packages to the container
distrobox create --image alpine:latest --name test2 --additional-packages "git tmux vim"
Use init-hooks to perform an action during container startup
distrobox create --image alpine:latest --name test --init-hooks "touch /var/tmp/test1 && touch /var/tmp/test2"
Use pre-init-hooks to perform an action at the beginning of the container startup (before any package
manager starts)
distrobox create -i docker.io/almalinux/8-init --init --name test --pre-init-hooks "dnf config-manager --enable powertools && dnf -y install epel-release"
Use init to create a Systemd container (acts similar to an LXC):
distrobox create -i ubuntu:latest --name test --additional-packages "systemd libpam-systemd pipewire-audio-client-libraries" --init
Use init to create a OpenRC container (acts similar to an LXC):
distrobox create -i alpine:latest --name test --additional-packages "openrc" --init
Use host’s NVidia drivers integration
distrobox create --image ubuntu:22.04 --name ubuntu-nvidia --nvidia
Do not use host’s IP inside the container:
distrobox create --image ubuntu:latest --name test --unshare-netns
Create a more isolated container, where only the $HOME, basic sockets and host’s FS (in /run/host) is
shared:
distrobox create --name unshared-test --unshare-all
Create a more isolated container, with it’s own init system, this will act very similar to a full LXC
container:
distrobox create --name unshared-init-test --unshare-all --init --image fedora:latest
Use environment variables to specify container name, image and container manager:
DBX_CONTAINER_MANAGER="docker" DBX_NON_INTERACTIVE=1 DBX_CONTAINER_NAME=test-alpine DBX_CONTAINER_IMAGE=alpine distrobox-create
ENVIRONMENT VARIABLES
DBX_CONTAINER_ALWAYS_PULL
DBX_CONTAINER_CUSTOM_HOME
DBX_CONTAINER_HOME_PREFIX
DBX_CONTAINER_IMAGE
DBX_CONTAINER_MANAGER
DBX_CONTAINER_NAME
DBX_CONTAINER_HOSTNAME
DBX_NON_INTERACTIVE
DBX_SUDO_PROGRAM
DBX_CONTAINER_HOME_PREFIX defines where containers’ home directories will be located. If you define it
as ~/dbx then all future containers’ home directories will be ~/dbx/$container_name
EXTRA
The --additional-flags or -a is useful to modify defaults in the container creations. For example:
distrobox create -i docker.io/library/archlinux -n dev-arch
podman container inspect dev-arch | jq '.[0].HostConfig.PidsLimit'
2048
distrobox rm -f dev-arch
distrobox create -i docker.io/library/archlinux -n dev-arch --volume $CBL_TC:/tc --additional-flags "--pids-limit -1"
podman container inspect dev-arch | jq '.[0].HostConfig,.PidsLimit'
0
Additional volumes can be specified using the --volume flag. This flag follows the same standard as
docker and podman to specify the mount point so --volume SOURCE_PATH:DEST_PATH:MODE.
distrobox create --image docker.io/library/archlinux --name dev-arch --volume /usr/share/:/var/test:ro
During container creation, it is possible to specify (using the additional-flags) some environment
variables that will persist in the container and be independent from your environment:
distrobox create --image fedora:35 --name test --additional-flags "--env MY_VAR=value"
The --init-hooks is useful to add commands to the entrypoint (init) of the container. This could be
useful to create containers with a set of programs already installed, add users, groups.
distrobox create --image fedora:35 --name test --init-hooks "dnf groupinstall -y \"C Development Tools and Libraries\""
The --init is useful to create a container that will use its own separate init system within. For
example using:
distrobox create -i docker.io/almalinux/8-init --init --name test
distrobox create -i docker.io/library/debian --additional-packages "systemd" --init --name test-debian
Inside the container we will be able to use normal systemd units:
~$ distrobox enter test
user@test:~$ sudo systemctl enable --now sshd
user@test:~$ sudo systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-01-28 22:54:50 CET; 17s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 291 (sshd)
Note that enabling --init will disable host’s process integration. From within the container you will
not be able to see and manage host’s processes. This is needed because /sbin/init must be pid 1.
If you want to use a non-pre-create image, you’ll need to add the additional package:
distrobox create -i alpine:latest --init --additional-packages "openrc" -n test
distrobox create -i debian:stable --init --additional-packages "systemd libpam-systemd pipewire-audio-client-libraries" -n test
distrobox create -i ubuntu:22.04 --init --additional-packages "systemd libpam-systemd pipewire-audio-client-libraries" -n test
distrobox create -i archlinux:latest --init --additional-packages "systemd" -n test
distrobox create -i registry.opensuse.org/opensuse/tumbleweed:latest --init --additional-packages "systemd" -n test
distrobox create -i registry.fedoraproject.org/fedora:39 --init --additional-packages "systemd" -n test
The --init flag is useful to create system containers, where the container acts more similar to a full VM
than an application-container. Inside you’ll have a separate init, user-session, daemons and so on.
The --home flag let’s you specify a custom HOME for the container. Note that this will NOT prevent the
mount of the host’s home directory, but will ensure that configs and dotfiles will not litter it.
The --root flag will let you create a container with real root privileges. At first enter the user will
be required to setup a password. This is done in order to not enable passwordless sudo/su, in a rootful
container, this is needed because in this mode, root inside the container is also root outside the
container!
The --absolutely-disable-root-password-i-am-really-positively-sure will skip user password setup, leaving
it blank. This is genuinely dangerous and you really, positively should NOT enable this.
From version 1.4.0 of distrobox, when you create a new container, it will also generate an entry in the
applications list.
NVidia integration
If your host has an NVidia gpu, with installed proprietary drivers, you can integrate them with the
guests by using the --nvidia flag:
distrobox create --nvidia --image ubuntu:latest --name ubuntu-nvidia
Be aware that this is not compatible with non-glibc systems and needs somewhat newer distributions to
work.
This feature was tested working on:
• Almalinux
• Archlinux
• Centos 7 and newer
• Clearlinux
• Debian 10 and newer
• OpenSUSE Leap
• OpenSUSE Tumbleweed
• Rockylinux
• Ubuntu 18.04 and newer
• Void Linux (glibc)
Distrobox Jan 2025 DISTROBOX-CREATE(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-ENTER(1) User Manual DISTROBOX-ENTER(1)
NAME
distrobox enter
distrobox-enter
DESCRIPTION
distrobox-enter takes care of entering the container with the name specified. Default command executed
is your SHELL, but you can specify different shells or entire commands to execute. If using it inside a
script, an application, or a service, you can specify the –headless mode to disable tty and
interactivity.
SYNOPSIS
distrobox enter
--name/-n: name for the distrobox default: my-distrobox
--/-e: end arguments execute the rest as command to execute at login default: default ${USER}'s shell
--no-tty/-T: do not instantiate a tty
--no-workdir/-nw: always start the container from container's home directory
--additional-flags/-a: additional flags to pass to the container manager command
--help/-h: show this message
--root/-r: launch podman/docker/lilipod with root privileges. Note that if you need root this is the preferred
way over "sudo distrobox" (note: if using a program other than 'sudo' for root privileges is necessary,
specify it through the DBX_SUDO_PROGRAM env variable, or 'distrobox_sudo_program' config variable)
--dry-run/-d: only print the container manager command generated
--verbose/-v: show more verbosity
--version/-V: show version
EXAMPLES
Enter a distrobox named “example”
distrobox-enter example
Enter a distrobox specifying a command
distrobox-enter --name fedora-toolbox-35 -- bash -l
distrobox-enter my-alpine-container -- sh -l
Use additional podman/docker/lilipod flags while entering a distrobox
distrobox-enter --additional-flags "--preserve-fds" --name test -- bash -l
Specify additional environment variables while entering a distrobox
distrobox-enter --additional-flags "--env MY_VAR=value" --name test -- bash -l
MY_VAR=value distrobox-enter --additional-flags "--preserve-fds" --name test -- bash -l
You can also use environment variables to specify container manager and container name:
DBX_CONTAINER_MANAGER="docker" DBX_CONTAINER_NAME=test-alpine distrobox-enter
ENVIRONMENT VARIABLES
DBX_CONTAINER_NAME
DBX_CONTAINER_MANAGER
DBX_SKIP_WORKDIR
DBX_SUDO_PROGRAM
EXTRA
This command is used to enter the distrobox itself. Personally, I just create multiple profiles in my
gnome-terminal to have multiple distros accessible.
The --additional-flags or -a is useful to modify default command when executing in the container. For
example:
distrobox enter -n dev-arch --additional-flags "--env my_var=test" -- printenv &| grep my_var
my_var=test
This is possible also using normal env variables:
my_var=test distrobox enter -n dev-arch --additional-flags -- printenv &| grep my_var
my_var=test
If you’d like to enter a rootful container having distrobox use a program other than `sudo' to run
podman/docker/lilipod as root, such as `pkexec' or `doas', you may specify it with the DBX_SUDO_PROGRAM
environment variable. For example, to use `doas' to enter a rootful container:
DBX_SUDO_PROGRAM="doas" distrobox enter -n container --root
Additionally, in one of the config file paths that distrobox supports, such as ~/.distroboxrc, you can
also append the line distrobox_sudo_program="doas" (for example) to always run distrobox commands
involving rootful containers using `doas'.
Distrobox Jan 2025 DISTROBOX-ENTER(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-EPHEMERAL(1) User Manual DISTROBOX-EPHEMERAL(1)
NAME
distrobox ephemeral
distrobox-ephemeral
DESCRIPTION
distrobox-ephemeral creates a temporary distrobox that is automatically destroyed when the command is
terminated.
SYNOPSIS
distrobox ephemeral
--root/-r: launch podman/docker/lilipod with root privileges. Note that if you need root this is the preferred
way over "sudo distrobox" (note: if using a program other than 'sudo' for root privileges is necessary,
specify it through the DBX_SUDO_PROGRAM env variable, or 'distrobox_sudo_program' config variable)
--verbose/-v: show more verbosity
--help/-h: show this message
--/-e: end arguments execute the rest as command to execute at login default: default ${USER}'s shell
--version/-V: show version
EXAMPLES
distrobox-ephemeral --image alpine:latest -- cat /etc/os-release
distrobox-ephemeral --root --verbose --image alpine:latest --volume /opt:/opt
You can also use flags from distrobox-create to customize the ephemeral container to run.
SEE ALSO
distrobox-create --help
man distrobox-create
ENVIRONMENT VARIABLES
distrobox-ephemeral calls distrobox-create, SEE ALSO distrobox-create(1) for
a list of supported environment variables to use.
Distrobox Jan 2025 DISTROBOX-EPHEMERAL(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-EXPORT(1) User Manual DISTROBOX-EXPORT(1)
NAME
distrobox-export
DESCRIPTION
Application and binary exporting
distrobox-export takes care of exporting an app or a binary from the container to the host.
The exported app will be easily available in your normal launcher and it will automatically be launched
from the container it is exported from.
SYNOPSIS
distrobox-export
--app/-a: name of the application to export or absolute path to desktopfile to export
--bin/-b: absolute path of the binary to export
--list-apps: list applications exported from this container
--list-binaries list binaries exported from this container, use -ep to specify custom paths to search
--delete/-d: delete exported application or binary
--export-label/-el: label to add to exported application name.
Use "none" to disable.
Defaults to (on \$container_name)
--export-path/-ep: path where to export the binary
--extra-flags/-ef: extra flags to add to the command
--enter-flags/-nf: flags to add to distrobox-enter
--sudo/-S: specify if the exported item should be run as sudo
--help/-h: show this message
--verbose/-v: show more verbosity
--version/-V: show version
You may want to install graphical applications or CLI tools in your distrobox. Using distrobox-export
from inside the container will let you use them from the host itself.
EXAMPLES
distrobox-export --app mpv [--extra-flags "flags"] [--delete] [--sudo]
distrobox-export --bin /path/to/bin [--export-path ~/.local/bin] [--extra-flags "flags"] [--delete] [--sudo]
App export example
distrobox-export --app abiword
This tool will simply copy the original .desktop files along with needed icons, add the prefix
/usr/local/bin/distrobox-enter -n distrobox_name -e ... to the commands to run, and save them in your
home to be used directly from the host as a normal app.
distrobox-export --app /opt/application/my-app.desktop
This will skip searching for the desktopfile in canonical paths, and just use the provided file path.
Binary export example
distrobox-export --bin /usr/bin/code --extra-flags "--foreground" --export-path $HOME/.local/bin
In the case of exporting binaries, you will have to specify where to export it (--export-path) and the
tool will create a little wrapper script that will distrobox-enter -e from the host, the desired binary.
This can be handy with the use of direnv to have different versions of the same binary based on your env
or project.
The exported binaries will be exported in the “–export-path” of choice as a wrapper script that acts
naturally both on the host and in the container.
Additional flags
You can specify additional flags to add to the command, for example if you want to export an electron
app, you could add the “–foreground” flag to the command:
distrobox-export --app atom --extra-flags "--foreground"
distrobox-export --bin /usr/bin/vim --export-path ~/.local/bin --extra-flags "-p"
This works for binaries and apps. Extra flags are only used then the exported app or binary is used from
the host, using them inside the container will not include them.
Unexport
The option “–delete” will un-export an app or binary
distrobox-export --app atom --delete
distrobox-export --bin /usr/bin/vim --export-path ~/.local/bin --delete
Run as root in the container
The option “–sudo” will launch the exported item as root inside the distrobox.
Notes
Note you can use –app OR –bin but not together. [IMAGE: app-export] app-export
NOTE: some electron apps such as vscode and atom need additional flags to work from inside the container,
use the --extra-flags option to provide a series of flags, for example:
distrobox-export --app atom --extra-flags "--foreground"
Distrobox Jan 2025 DISTROBOX-EXPORT(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-GENERATE-ENTRY(1) User Manual DISTROBOX-GENERATE-ENTRY(1)
NAME
distrobox generate-entry
DESCRIPTION
distrobox-generate-entry will create a desktop icon for one of the available distroboxes. This will be
then deleted when you remove the matching distrobox.
SYNOPSIS
distrobox generate-entry
--help/-h: show this message
--all/-a: perform for all distroboxes
--delete/-d: delete the entry
--icon/-i: specify a custom icon [/path/to/icon] (default auto)
--root/-r: perform on rootful distroboxes
--verbose/-v: show more verbosity
--version/-V: show version
EXAMPLES
Generate an entry for a container
distrobox generate-entry my-container-name
Specify a custom icon for the entry
distrobox generate-entry my-container-name --icon /path/to/icon.png
Generate an entry for all distroboxes
distrobox generate-entry --all
Delete an entry
distrobox generate-entry container-name --delete
Distrobox Jan 2025 DISTROBOX-GENERATE-ENTRY(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-HOST-EXEC(1) User Manual DISTROBOX-HOST-EXEC(1)
NAME
distrobox-host-exec
DESCRIPTION
distrobox-host-exec lets one execute command on the host, while inside of a container.
Under the hood, distrobox-host-exec uses host-spawn a project that lets us execute commands back on the
host. If the tool is not found the user will be prompted to install it.
SYNOPSIS
Just pass to “distrobox-host-exec” any command and all its arguments, if any.
--help/-h: show this message
--verbose/-v: show more verbosity
--version/-V: show version
--yes/-Y: Automatically answer yes to prompt:
host-spawn will be installed on the guest system
if host-spawn is not detected.
This behaviour is default when running in a non-interactive shell.
If no command is provided, it will execute “$SHELL”.
Alternatively, use symlinks to make distrobox-host-exec execute as that command:
~$: ln -s /usr/bin/distrobox-host-exec /usr/local/bin/podman
~$: ls -l /usr/local/bin/podman
lrwxrwxrwx. 1 root root 51 Jul 11 19:26 /usr/local/bin/podman -> /usr/bin/distrobox-host-exec
~$: podman version
...this is executed on host...
EXAMPLES
distrobox-host-exec ls
distrobox-host-exec bash -l
distrobox-host-exec flatpak run org.mozilla.firefox
distrobox-host-exec podman ps -a
Distrobox Jan 2025 DISTROBOX-HOST-EXEC(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-INIT(1) User Manual DISTROBOX-INIT(1)
NAME
distrobox-init
DESCRIPTION
Init the distrobox (not to be launched manually)
distrobox-init is the entrypoint of a created distrobox. Note that this HAS to run from inside a
distrobox, will not work if you run it from your host.
This is not intended to be used manually, but instead used by distrobox-create to set up the container’s
entrypoint.
distrobox-init will take care of installing missing dependencies (eg. sudo), set up the user and groups,
mount directories from the host to ensure the tight integration.
SYNOPSIS
distrobox-init
--name/-n: user name
--user/-u: uid of the user
--group/-g: gid of the user
--home/-d: path/to/home of the user
--help/-h: show this message
--additional-packages: packages to install in addition
--init/-I: whether to use or not init
--pre-init-hooks: commands to execute prior to init
--nvidia: try to integrate host's nVidia drivers in the guest
--upgrade/-U: run init in upgrade mode
--verbose/-v: show more verbosity
--version/-V: show version
--: end arguments execute the rest as command to execute during init
EXAMPLES
distrobox-init --name test-user --user 1000 --group 1000 --home /home/test-user
distrobox-init --upgrade
Distrobox Jan 2025 DISTROBOX-INIT(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-LIST(1) User Manual DISTROBOX-LIST(1)
NAME
distrobox list
distrobox-list
DESCRIPTION
distrobox-list lists available distroboxes. It detects them and lists them separately from the rest of
normal containers.
SYNOPSIS
distrobox list
--help/-h: show this message
--no-color: disable color formatting
--root/-r: launch podman/docker/lilipod with root privileges. Note that if you need root this is the preferred
way over "sudo distrobox" (note: if using a program other than 'sudo' for root privileges is necessary,
specify it through the DBX_SUDO_PROGRAM env variable, or 'distrobox_sudo_program' config variable)
--verbose/-v: show more verbosity
--version/-V: show version
EXAMPLES
distrobox-list
You can also use environment variables to specify container manager
DBX_CONTAINER_MANAGER="docker" distrobox-list
ENVIRONMENT VARIABLES
DBX_CONTAINER_MANAGER
DBX_SUDO_PROGRAM
[IMAGE: image] image
Distrobox Jan 2025 DISTROBOX-LIST(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-RM(1) User Manual DISTROBOX-RM(1)
NAME
distrobox rm
distrobox-rm
DESCRIPTION
distrobox-rm delete one of the available distroboxes.
SYNOPSIS
distrobox rm
--all/-a: delete all distroboxes
--force/-f: force deletion
--rm-home: remove the mounted home if it differs from the host user's one
--root/-r: launch podman/docker/lilipod with root privileges. Note that if you need root this is the preferred
way over "sudo distrobox" (note: if using a program other than 'sudo' for root privileges is necessary,
specify it through the DBX_SUDO_PROGRAM env variable, or 'distrobox_sudo_program' config variable)
--help/-h: show this message
--verbose/-v: show more verbosity
--version/-V: show version
EXAMPLES
distrobox-rm container-name [--force] [--all]
You can also use environment variables to specify container manager and name:
DBX_CONTAINER_MANAGER="docker" DBX_CONTAINER_NAME=test-alpine distrobox-rm
ENVIRONMENT VARIABLES
DBX_CONTAINER_MANAGER
DBX_CONTAINER_NAME
DBX_NON_INTERACTIVE
DBX_SUDO_PROGRAM
Distrobox Jan 2025 DISTROBOX-RM(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-STOP(1) User Manual DISTROBOX-STOP(1)
NAME
distrobox stop
distrobox-stop
DESCRIPTION
distrobox-stop stop a running distrobox.
Distroboxes are left running, even after exiting out of them, so that subsequent enters are really quick.
This is how they can be stopped.
SYNOPSIS
distrobox stop
--all/-a: stop all distroboxes
--yes/-Y: non-interactive, stop without asking
--help/-h: show this message
--root/-r: launch podman/docker/lilipod with root privileges. Note that if you need root this is the preferred
way over "sudo distrobox" (note: if using a program other than 'sudo' for root privileges is necessary,
specify it through the DBX_SUDO_PROGRAM env variable, or 'distrobox_sudo_program' config variable)
--verbose/-v: show more verbosity
--version/-V: show version
EXAMPLES
distrobox-stop container-name1 container-name2
distrobox-stop container-name
distrobox-stop --all
You can also use environment variables to specify container manager and name:
DBX_CONTAINER_MANAGER="docker" DBX_CONTAINER_NAME=test-alpine distrobox-stop
ENVIRONMENT VARIABLES
DBX_CONTAINER_MANAGER
DBX_CONTAINER_NAME
DBX_NON_INTERACTIVE
DBX_SUDO_PROGRAM
Distrobox Jan 2025 DISTROBOX-STOP(1)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
DISTROBOX-UPGRADE(1) User Manual DISTROBOX-UPGRADE(1)
NAME
distrobox-upgrade
DESCRIPTION
distrobox-upgrade will enter the specified list of containers and will perform an upgrade using the
container’s package manager.
SYNOPSIS
distrobox upgrade
--help/-h: show this message
--all/-a: perform for all distroboxes
--running: perform only for running distroboxes
--root/-r: launch podman/docker/lilipod with root privileges. Note that if you need root this is the preferred
way over "sudo distrobox" (note: if using a program other than 'sudo' for root privileges is necessary,
specify it through the DBX_SUDO_PROGRAM env variable, or 'distrobox_sudo_program' config variable)
--verbose/-v: show more verbosity
--version/-V: show version
EXAMPLES
Upgrade all distroboxes
distrobox-upgrade --all
Upgrade all running distroboxes
distrobox-upgrade --all --running
Upgrade a specific distrobox
distrobox-upgrade alpine-linux
Upgrade a list of distroboxes
distrobox-upgrade alpine-linux ubuntu22 my-distrobox123
Automatically update all distro
You can create a systemd service to perform distrobox-upgrade automatically, this example shows how to
run it daily:
~/.config/systemd/user/distrobox-upgrade.service
[Unit]
Description=distrobox-upgrade Automatic Update
[Service]
Type=simple
ExecStart=distrobox-upgrade --all
StandardOutput=null
~/.config/systemd/user/distrobox-upgrade.timer
[Unit]
Description=distrobox-upgrade Automatic Update Trigger
[Timer]
OnBootSec=1h
OnUnitInactiveSec=1d
[Install]
WantedBy=timers.target
Then simply do a systemctl --user daemon-reload && systemctl --user enable --now distrobox-upgrade.timer
Distrobox Jan 2025 DISTROBOX-UPGRADE(1)