Documents
packages
packages
Type
External
Status
Published
Created
Jun 13, 2026
Updated
Jun 13, 2026
Source
View

Package Management#

When to use#

  • Adding, removing, or updating RPM packages in the image
  • Figuring out which build script owns a package
  • Debugging dnf install failures in CI

Package locations#

TypeLocationNotes
Main install listbuild_scripts/packages/base.toml [install]From base/EPEL repos
Install-time excludesbuild_scripts/packages/base.toml [install_excluded]Passed as -x flags
GNOME 50 package listbuild_scripts/packages/base.toml [gnome]Minimal GNOME group
GNOME install excludesbuild_scripts/packages/base.toml [gnome_excluded]Passed as -x flags
Packages removed pre-installbuild_scripts/packages/base.toml [remove]dnf remove before main install
GNOME versionlock pinsbuild_scripts/packages/base.toml [versionlock_gnome]Pinned against EL10 downgrades
GNOME base setupbuild_scripts/overrides/base/10-packages-image-base.shGroup installs + repo setup; not TOML
NVIDIA driver installbuild_scripts/overrides/gdx/20-nvidia.shOrchestration only; no TOML
dx packagesbuild_scripts/overrides/dx/00-packages.shVSCode, Docker, libvirt, cockpit
gdx packagesbuild_scripts/overrides/gdx/30-packages.shuv, nvtop

Adding a package#

Edit build_scripts/packages/base.toml, add to the correct section, then validate:

# Verify the manifest parses cleanly
python3 build_scripts/scripts/read-packages build_scripts/packages/base.toml install | grep <package>
just check

The read-packages helper uses tomllib (Python 3.11+ stdlib — no new dependencies).
It is called inside build scripts as:

readarray -t PKGS < <(python3 /run/context/build_scripts/scripts/read-packages \
    /run/context/build_scripts/packages/base.toml install)

Non-obvious patterns#

  • Group installs stay in shell. dnf group install "Core" and similar stay in 10-packages-image-base.sh — they cannot be represented as flat package arrays and are too coupled to ordering logic.
  • Context path is /run/context/, not /ctx/ as in bluefin. Any reference to build scripts inside a RUN step must use /run/context/build_scripts/....
  • versionlock_gnome must stay in sync with GNOME 50 COPR. If a package is added to the GNOME 50 COPR repo, it likely needs a versionlock entry to prevent the EL10 base version from winning on reinstall.
  • CentOS Stream 10 uses dnf not dnf5. Do not copy dnf5-specific flags from the bluefin (Fedora) scripts.

Common failure modes#

SymptomLikely causeFix
read-packages: section 'X' not foundWrong section name in TOMLCheck section names in base.toml
Package not found during dnf installPackage not in base/EPEL, needs COPRAdd COPR enablement in the shell script
GNOME 50 component downgradedMissing versionlock entryAdd to [versionlock_gnome]
tomllib import errorPython < 3.11 in build containerCentOS Stream 10 ships Python 3.12 — should not occur