/ Containerfile
Containerfile
  1  FROM quay.io/fedora/fedora-bootc:latest
  2  
  3  # Install basic system
  4  RUN <<END_OF_BLOCK
  5  set -eu
  6  
  7  mkdir /var/roothome
  8  
  9  dnf -y install dnf5-plugins
 10  
 11  dnf -y copr enable neilalexander/yggdrasil-go
 12  
 13  dnf -y install  --setopt="install_weak_deps=False" \
 14  	NetworkManager-tui \
 15  	cockpit \
 16  	mc \
 17  	htop \
 18  	zsh \
 19  	jq \
 20  	yggdrasil \
 21  	radvd \
 22  	dhcp-server \
 23  	greenboot \
 24  	dhcp-server \
 25  	greenboot-default-health-checks \
 26  	firewalld \
 27  	freeipa-client
 28  
 29  dnf -y clean all
 30  END_OF_BLOCK
 31  
 32  # Install local packages (if available).
 33  RUN --mount=type=bind,source=./packages,target=/packages  <<END_OF_BLOCK
 34  set -eu
 35  shopt -s extglob
 36  shopt -s nullglob
 37  
 38  for file in /packages/*.@("$(arch)".rpm|noarch.rpm); do
 39  	dnf -y install "$file"
 40  done
 41  
 42  END_OF_BLOCK
 43  ARG sshkeys=""
 44  ENV imagename="gatekeeper-os"
 45  ARG buildid="unset"
 46  ARG commit="unknown"
 47  
 48  LABEL org.opencontainers.image.vendor="Dirk Gottschalk" \
 49  	org.opencontainers.image.authors="Dirk Gottschalk" \
 50  	org.opencontainers.image.name=${imagename} \
 51  	org.opencontainers.image.version=${buildid} \
 52  	org.opencontainers.image.description="A bootc gateway/router image." \
 53  	org.opencontainers.image.commit-id=${commit}
 54  
 55  # Copy prepared files
 56  COPY --chmod=600 configs/ssh-00-0local.conf /etc/ssh/sshd_config.d/00-0local.conf
 57  COPY --chmod=644 configs/rpm-ostreed.conf /etc/rpm-ostreed.conf
 58  COPY --chmod=644 configs/watchdog.conf /etc/watchdog.conf
 59  COPY --chmod=700 scripts/device-init.sh /usr/bin/device-init.sh
 60  COPY --chmod=700 scripts/bootupctl-shim /usr/bin/bootupctl
 61  COPY --chmod=600 configs/sudoers-wheel /etc/sudoers.d/wheel
 62  COPY --chmod=600 configs/jail-10-sshd.conf /etc/fail2ban/jail.d/10-sshd.conf
 63  COPY --chmod=644 configs/dconf-user /usr/share/dconf/profile/user
 64  COPY --chmod=644 configs/dconf-00-extensions /etc/dconf/db/local.d/00-extensions
 65  COPY --chmod=644 configs/tmpfiles.conf /usr/lib/tmpfiles.d/cardterm.conf
 66  COPY --chmod=644 configs/sysusers-yggdrasil.conf /usr/lib/sysusers.d/yggdrasil.conf
 67  COPY systemd /usr/lib/systemd/system
 68  
 69  # Image signature settings
 70  COPY --chmod=644 configs/registries-sigstore.yaml /usr/share/containers/registries.d/sigstore.yaml
 71  COPY --chmod=644 configs/containers-toolbox.conf /etc/containers/toolbox.conf
 72  COPY --chmod=644 configs/containers-policy.json /usr/share/containers/policy.json
 73  COPY --chmod=644 keys /usr/share/containers/keys
 74  
 75  # Do some 'abrakadabra' to build the image.
 76  RUN <<END_OF_MAGIC
 77  # Abort on error and when unbound variables are used
 78  set -eu
 79  
 80  echo "IMAGE_ID=${buildid}" >>/usr/lib/os-release
 81  echo "IMAGE_VERSION=${imagename}" >>/usr/lib/os-release
 82  
 83  # Embed ssh keys for root if provided
 84  if [[ -n "$sshkeys" ]]; then
 85  	mkdir -p /usr/ssh
 86  	echo $sshkeys > /usr/ssh/root.pub
 87  fi
 88  
 89  # Enable required services
 90  systemctl enable device-init firewalld cockpit.socket yggdrasil
 91  
 92  # Configure Firewall with some defaults
 93  firewall-offline-cmd --zone=public --add-service=dhcpv6-client
 94  firewall-offline-cmd --zone=public --add-service=mdns
 95  firewall-offline-cmd --zone=public --add-service=ssh
 96  firewall-offline-cmd --new-zone=mesh
 97  firewall-offline-cmd --zone=mesh --add-interface=tun0
 98  firewall-offline-cmd --zone=mesh --add-service=ssh
 99  firewall-offline-cmd --new-policy=int-to-pub
100  firewall-offline-cmd --policy=int-to-pub --add-ingress-zone=internal
101  firewall-offline-cmd --policy=int-to-pub --add-egress-zone=public
102  firewall-offline-cmd --policy=int-to-pub --set-target=ACCEPT
103  firewall-offline-cmd --new-policy=public-to-int
104  firewall-offline-cmd --policy=public-to-int --add-ingress-zone=public
105  firewall-offline-cmd --policy=public-to-int --add-egress-zone=internal
106  firewall-offline-cmd --policy=public-to-int --set-target=CONTINUE
107  firewall-offline-cmd --new-policy=int-to-mesh
108  firewall-offline-cmd --policy=int-to-mesh --add-ingress-zone=internal
109  firewall-offline-cmd --policy=int-to-mesh --add-egress-zone=mesh
110  firewall-offline-cmd --policy=int-to-mesh --set-target=ACCEPT
111  firewall-offline-cmd --new-policy=mesh-to-int
112  firewall-offline-cmd --policy=mesh-to-int --set-target=CONTINUE
113  
114  rm -rf /var/{cache,log,tmp,spool}/*
115  
116  END_OF_MAGIC