|
1 | | -ARG FEDORA_VERSION=42 |
2 | | - |
3 | | -FROM ghcr.io/ublue-os/silverblue-asus-nvidia:${FEDORA_VERSION} |
4 | | -ARG FEDORA_VERSION |
5 | | -RUN sed -i "s|^NAME=.*|NAME=nxtcoder17 edition silverblue ${FEDORA_VERSION}|" /usr/lib/os-release |
6 | | -RUN sed -i "s|^PRETTY_NAME=.*|PRETTY_NAME=nxtcoder17 edition silverblue ${FEDORA_VERSION}|" /usr/lib/os-release |
7 | | -RUN rpm-ostree override remove firefox firefox-langpacks |
8 | | -RUN rpm-ostree install distrobox docker hyprland niri |
9 | | -RUN rpm-ostree cleanup -m && ostree container commit |
| 1 | +# Simplified Containerfile for Fedora Silverblue with NVIDIA drivers |
| 2 | +# Based on ublue-os/main |
| 3 | +# Scripts are fetched directly from ublue-os/main repo - no local maintenance needed! |
| 4 | + |
| 5 | +# Build configuration |
| 6 | +ARG FEDORA_VERSION="${FEDORA_VERSION:-42}" |
| 7 | +ARG IMAGE_NAME="${IMAGE_NAME:-silverblue}" |
| 8 | + |
| 9 | +# Image sources |
| 10 | +ARG UBLUE_REGISTRY="ghcr.io/ublue-os" |
| 11 | +ARG FEDORA_IMAGE="quay.io/fedora-ostree-desktops/silverblue" |
| 12 | + |
| 13 | +# Optional digest pinning for reproducible builds |
| 14 | +ARG BASE_IMAGE_DIGEST="" |
| 15 | +ARG AKMODS_DIGEST="" |
| 16 | +ARG NVIDIA_AKMODS_DIGEST="" |
| 17 | + |
| 18 | +# Stage 1: Clone ublue-os/main and merge packages |
| 19 | +FROM alpine/git AS buildctx |
| 20 | +ARG UBLUE_MAIN_VERSION="main" |
| 21 | + |
| 22 | +RUN apk add --no-cache yq jq |
| 23 | + |
| 24 | +RUN <<EOF |
| 25 | + echo "Cloning ublue-os/main repo (branch: $UBLUE_MAIN_VERSION)..." |
| 26 | + git clone --depth=1 --branch "${UBLUE_MAIN_VERSION}" \ |
| 27 | + https://github.com/ublue-os/main.git ./ublue-os |
| 28 | + mv ublue-os/sys_files ./ |
| 29 | + mv ublue-os/build_files ./ |
| 30 | + mv ublue-os/packages.json ./ublue-packages.json |
| 31 | +EOF |
| 32 | + |
| 33 | +COPY packages.yml ./ |
| 34 | + |
| 35 | +RUN <<EOF |
| 36 | + set -ex |
| 37 | + echo "Merging ublue packages with custom packages..." |
| 38 | + |
| 39 | + # Extract ublue packages for "all" and "silverblue" sections |
| 40 | + UBLUE_ALL=$(jq -r '.all.include.all[]' ublue-packages.json) |
| 41 | + UBLUE_SILVERBLUE=$(jq -r '.all.include.silverblue[]' ublue-packages.json) |
| 42 | + |
| 43 | + # Convert your YAML packages to JSON array |
| 44 | + YOUR_PACKAGES=$(yq -o=json '.packages' packages.yml) |
| 45 | + |
| 46 | + # Merge all three lists, deduplicate and sort |
| 47 | + jq -n \ |
| 48 | + --arg ublue_all "$UBLUE_ALL" \ |
| 49 | + --arg ublue_sb "$UBLUE_SILVERBLUE" \ |
| 50 | + --argjson yours "$YOUR_PACKAGES" \ |
| 51 | + '{"packages": (($ublue_all | split("\n")) + ($ublue_sb | split("\n")) + $yours | unique | sort)}' \ |
| 52 | + > packages.json |
| 53 | + |
| 54 | + echo "Final package list ($(jq -r '.packages | length' packages.json) packages):" |
| 55 | + jq -r '.packages[]' packages.json |
| 56 | +EOF |
| 57 | + |
| 58 | +# Stage 2: Get kernel modules from ublue-os |
| 59 | +FROM ${UBLUE_REGISTRY}/akmods:main-${FEDORA_VERSION}${AKMODS_DIGEST:+@${AKMODS_DIGEST}} AS akmods |
| 60 | + |
| 61 | +# Stage 3: Get NVIDIA drivers from ublue-os |
| 62 | +FROM ${UBLUE_REGISTRY}/akmods-nvidia-open:main-${FEDORA_VERSION}${NVIDIA_AKMODS_DIGEST:+@${NVIDIA_AKMODS_DIGEST}} AS nvidia_akmods |
| 63 | + |
| 64 | +# Stage 4: Build final image |
| 65 | +FROM ${FEDORA_IMAGE}:${FEDORA_VERSION}${BASE_IMAGE_DIGEST:+@${BASE_IMAGE_DIGEST}} |
| 66 | + |
| 67 | +# Re-declare ARGs for use in this stage |
| 68 | +ARG FEDORA_VERSION="${FEDORA_VERSION:-42}" |
| 69 | +ARG IMAGE_NAME="${IMAGE_NAME:-silverblue}" |
| 70 | +ARG UBLUE_MAIN_VERSION="${UBLUE_MAIN_VERSION:-main}" |
| 71 | + |
| 72 | +# Download build scripts from ublue-os/main repo and execute |
| 73 | +RUN --mount=type=bind,from=buildctx,src=/,dst=/ctx \ |
| 74 | + --mount=type=bind,from=akmods,src=/rpms/ublue-os,dst=/tmp/akmods-rpms \ |
| 75 | + --mount=type=bind,from=akmods,src=/kernel-rpms,dst=/tmp/kernel-rpms \ |
| 76 | + --mount=type=bind,from=nvidia_akmods,src=/rpms,dst=/tmp/akmods-nv-rpms \ |
| 77 | + --mount=type=cache,target=/var/cache \ |
| 78 | + --mount=type=cache,target=/var/log \ |
| 79 | + set -ouex pipefail && \ |
| 80 | + rm -f /usr/bin/chsh /usr/bin/lchsh && \ |
| 81 | + export IMAGE_NAME="${IMAGE_NAME}" && \ |
| 82 | + export FEDORA_MAJOR_VERSION="${FEDORA_VERSION}" && \ |
| 83 | + echo "Running ublue-os build scripts..." && \ |
| 84 | + /ctx/build_files/install.sh && \ |
| 85 | + AKMODNV_PATH=/tmp/akmods-nv-rpms /ctx/build_files/nvidia-install.sh && \ |
| 86 | + /ctx/build_files/initramfs.sh && \ |
| 87 | + /ctx/build_files/post-install.sh && \ |
| 88 | + echo "Installing custom packages from packages.json..." && \ |
| 89 | + if [[ -f /buildctx/packages.json ]]; then \ |
| 90 | + readarray -t CUSTOM_PACKAGES < <(jq -r '.packages[]' /buildctx/packages.json); \ |
| 91 | + if [[ "${#CUSTOM_PACKAGES[@]}" -gt 0 ]]; then \ |
| 92 | + dnf5 -y install "${CUSTOM_PACKAGES[@]}"; \ |
| 93 | + fi; \ |
| 94 | + fi |
| 95 | + |
| 96 | +# Validate the image |
| 97 | +RUN ["bootc", "container", "lint"] |
| 98 | + |
0 commit comments