My Containerfiles
+--------------+
/| /|
/ | / |
*--+-----------* |
| | | |
| | | |
| | | |
| +-----------+--+
| / | /
|/ |/
*--------------*
All the Containerfiles I use.
Notes:
ghcr.io/
GitHub image registry, EXCEPT for bootc-
directories.git clone https://github.com/cdrage/containerfiles
and build it yourself (podman build -t username/container .
or docker build -t username/container
).Descriptions:
Below is a general overview (with instructions) on each Docker container I use. This is automatically generated from the comments that I have left in each Containerfile
.## Table of Contents
Description:
Used to generate aviation checklists. Based on the work by https://github.com/freerobby/aviation-checklist with the patch https://github.com/freerobby/aviation-checklist/pull/2
Running:
podman run -d \
-p 8080:80 \
--name aviation-checklist \
ghcr.io/cdrage/aviation-checklist
Description:
IMPORTANT NOTE: This is BOOTC. This is meant for bootable container applications. See: https://github.com/containers/podman-desktop-extension-bootc
This Containerfile is meant for testing GUI loading with the bootc extension using fedora:40. there are no users created in this image, so you will need to create a user to login from within the Containerfile using the "ARG" directive and a public SSH key. This is also very unstable..
Running:
Description:
IMPORTANT NOTE: This is BOOTC. This is meant for bootable container applications. See: https://github.com/containers/podman-desktop-extension-bootc
This Containerfile creates a simple httpd server on CentOS Stream 9. So you can run a web server on boot. This will be accessible on port 80.
Running:
Description:
IMPORTANT NOTE: This is BOOTC. This is meant for bootable container applications. See: https://github.com/containers/podman-desktop-extension-bootc
This Containerfile creates a simple httpd server on Fedora. So you can run a web server on boot. This will be accessible on port 80.
Running:
Description:
IMPORTANT NOTE: This is BOOTC. This is meant for bootable container applications. See: https://github.com/containers/podman-desktop-extension-bootc
This Containerfile creates a k3s master on AMD64 using CentOS Stream 9. So you can run a k8s server on boot.
In my setup, I have networking done on the ROUTER side where it will automatically assign an IP address based on the MAC. It is ideal to take note of this IP address as it will be needed for the nodes to join the cluster.
PRIVATE REGISTRY: If you want to pull from a private registry. Uncomment the "COPY auth.json /etc/ostree/auth.json" line and add your auth.json file. this auth.json file is typically found in ~/.config/containers/auth.json for podman users. Expanding your rootfs:
# RUN systemctl enable bootc-generic-growpart.service
from the Containerfile.GPU:
git.k8s.land/cdrage/bootc-nvidia-base-fedora
/ see bootc-nvidia-base-fedora
folder for more details.Notes:
Arguments are required in order to build this image with both your k3s K3S_TOKEN and your SSH public key. To do this, you must have the following (you can pass in this via --build-arg foo=bar on the CLI):
kubectl
to interact with the serverDescription:
IMPORTANT NOTE: This is BOOTC. This is meant for bootable container applications. See: https://github.com/containers/podman-desktop-extension-bootc
This Containerfile creates a k3s NODE on AMD64 using CentOS Stream 9. So you can run a k8s server on boot.
You must know the IP address of the master in order for these nodes to connect. PRIVATE REGISTRY: If you want to pull from a private registry. Uncomment the "COPY auth.json /etc/ostree/auth.json" line and add your auth.json file. this auth.json file is typically found in ~/.config/containers/auth.json for podman users. Expanding your rootfs:
# RUN systemctl enable bootc-generic-growpart.service
from the Containerfile.GPU:
git.k8s.land/cdrage/bootc-nvidia-base-fedora
/ see bootc-nvidia-base-fedora
folder for more details.Notes:
Arguments are required in order to build this image with both your k3s token and your SSH public key. To do this, you must have the following (you can pass in this via --build-arg foo=bar on the CLI):
Running:
Description:
IMPORTANT NOTE: This is BOOTC. This is meant for bootable container applications. See: https://github.com/containers/podman-desktop-extension-bootc
This Containerfile creates a MicroShift server on CentOS Stream 9. So you can run a Kubernetes-derivative server (OpenShift) by Red Hat. MicroShift is intended as an "Edge" version of OpenShift.
Pre-requisites:
Running:
/var/lib/microshift/resources/kubeadmin/kubeconfig
to ~/.kube/config
on the remote machine.kubectl get pods -A
or oc get pods -A
to see all the pods running.Interacting with the server:
After following the above "Running" steps, you can now interact with the OpenShift server using kubectl
or oc
commands. This can also be done from your local machine if you
copy the kubeconfig file from /var/lib/microshift/resources/kubeadmin/kubeconfig
to ~/.kube/config
on your local machine. You may need to edit the file to change the remote server IP address.
RUN echo -e ' OpenShift 4.17 release\n
Dependencies\n\
Description:
IMPORTANT NOTE: This is BOOTC. This is meant for bootable container applications. See: https://github.com/containers/podman-desktop-extension-bootc
This is a "base" container that installs the nvidia drivers and the nvidia container toolkit. This is meant to be used as a base for other containers that need GPU access.
DISABLE SECURE BOOT! You have been warned! Disable boot is KNOWN to cause issues with the nvidia drivers. ENABLE 4G DECODING in the BIOS. This is needed for certain nvidia cards to work such as the Tesla P40.
This uses Centos Stream 9 as the base image to (hopefully) be as stable as possible. Tried with Fedora 40 but found that the kernel was moving too fast for the nvidia drivers to keep up / work properly / update correctly.
IMPORTANT NOTE:
On boot, this will not have the nvidia drivers loaded it they are compiled. This is because akmods are suppose to be built on boot, but this doesn't work with bootc.
Instead, the nvidia drivers will recompile + use akmod + modprobe on boot.. and may take a minute to load.
If you have any systemd services that require the nvidia drivers, you will need to add a After=nvidia-drivers.service
to the service or have it LATE in the boot order (ex. multi-user.target)
to ensure that the nvidia drivers are loaded before the service starts.
For example, if you have a podman container with --restart=always, you will need to add a After=nvidia-drivers.service
to the podman-restart.service and podman-restart.timer. file.
This has been done for you already within the nvidia-drivers.service and nvidia-toolkit-firstboot.service files.
Note about nvidia-toolkit-fristboot.service file: This is a one-time service on boot that will create the /etc/cdi/nvidia.yaml file. This is necessary for podman to use gpu devices.
Running:
FROM git.k8s.land/cdrage/bootc-nvidia-base-centos
/ this Containerfile.Description:
IMPORTANT NOTE: This is BOOTC. This is meant for bootable container applications. See: https://github.com/containers/podman-desktop-extension-bootc
This is a "base" container that installs the nvidia drivers and the nvidia container toolkit. This is meant to be used as a base for other containers that need GPU access.
DISABLE SECURE BOOT! You have been warned! Disable boot is KNOWN to cause issues with the nvidia drivers. ENABLE 4G DECODING in the BIOS. This is needed for certain nvidia cards to work such as the Tesla P40.
This Fedora 40 as the base image to (hopefully) be as stable as possible. Tried with Fedora 40 but found that the kernel was moving too fast for the nvidia drivers to keep up / work properly / update correctly.
IMPORTANT NOTE:
On boot, this will not have the nvidia drivers loaded it they are compiled. This is because akmods are suppose to be built on boot, but this doesn't work with bootc.
Instead, the nvidia drivers will recompile + use akmod + modprobe on boot.. and may take a minute to load.
If you have any systemd services that require the nvidia drivers, you will need to add a After=nvidia-drivers.service
to the service or have it LATE in the boot order (ex. multi-user.target)
to ensure that the nvidia drivers are loaded before the service starts.
For example, if you have a podman container with --restart=always, you will need to add a After=nvidia-drivers.service
to the podman-restart.service and podman-restart.timer. file.
This has been done for you already within the nvidia-drivers.service and nvidia-toolkit-firstboot.service files.
Note about nvidia-toolkit-fristboot.service file: This is a one-time service on boot that will create the /etc/cdi/nvidia.yaml file. This is necessary for podman to use gpu devices.
Running:
FROM git.k8s.land/cdrage/bootc-nvidia-base-fedora
/ this Containerfile.Description:
Spinning maxwell the cat
Based on https://github.com/modem7/docker-rickroll/tree/master
Running:
podman run -d \
-p 8080:8080 \
--name cat \
ghcr.io/cdrage/cat
Description:
Very simple "steam server" container checker.
Checks to see if there is a game server running on port 27015 LOCALLY (same IP as actual server) meant to be ran alongside the steam server container.
Running:
podman run -d \
--name gameserver \
-p 3000:3000
ghcr.io/cdrage/gameserver
Description:
Super simple hello container that showcases a logo as well as environment information that may help for diagnosing
Running:
podman run -d \
-p 8080:8080 \
--name helloworld \
ghcr.io/cdrage/hello
Description:
Super simple helloworld container that says the hostname of the container
Running:
podman run -d \
-p 8080:8080 \
--name helloworld \
ghcr.io/cdrage/hello
Description: My Hugo file for hosting my personal wiki / journal / etc.
Running: podman run -d -p 1313:1313 --name hugo -v /path/to/hugo:/src -v /path/to/hugo/public:/dest ghcr.io/cdrage/hugo
Description:
Index page of k8s.land
Running:
podman run -d \
-p 8080:8080 \
--name index \
ghcr.io/cdrage/index
Description:
Encrypted journal (for writing your life entries!, not logs!)
In my case, I enter a timestamp each time I open the file and switch to vim insert mode.
Pass in your encrypted txt file and type in your password. It'll then open it up in vim for you to edit and type up your latest entry.
Remember, this is aes-256-cbc, so it's like hammering a nail with a screwdriver: http://stackoverflow.com/questions/16056135/how-to-use-openssl-to-encrypt-decrypt-files
Public / Private key would be better, but hell, this is just a text file.
First, encrypt a text file:
openssl aes-256-cbc -a -md md5 -salt -in foobar.txt -out foobar.enc
Now run it!
Running:
podman run -it --rm \
-v ~/txt.enc:/tmp/txt.enc \
-v /etc/localtime:/etc/localtime:ro \
ghcr.io/cdrage/jrl
This will ask for your password, decrypt it to a tmp folder and open it in vim. Once you :wq the file, it'll save.
Description:
Originally from: https://github.com/thijsvanloef/palworld-server-docker
Used to run the "palworld" game
Running:
podman run -d \
--name palworld\
-p 8211:8211 \
-p 8221:8221 \
-p 27015:27015 \
-v <palworld-folder>:/palworld/ \
-e PLAYERS=16 \
-e PORT=8211 \
-e MULTITHREADING=true \
-e PUBLIC_IP="" \
-e PUBLIC_PORT="" \
-e COMMUNITY=true \
-e SERVER_NAME="My Palworld Server" \
-e SERVER_PASSWORD="supersecret" \
-e ADMIN_PASSWORD="supersecret" \
-e UPDATE_ON_BOOT=true \
--restart unless-stopped \
cdrage/palworld
Description:
Yeah...
Based on https://github.com/modem7/docker-rickroll/tree/master
Running:
podman run -d \
-p 8080:8080 \
--name rickroll \
ghcr.io/cdrage/rickroll
IMPORTANT NOTE: Description:
This is a "hello world" GPU container that showcases fractals by using a "minimal POC" vulkan compute example project. Every X seconds, the fractal will be recalculated and displayed in the browser. This is all rendered on the virtualized GPU.
Technical Description: You must use Podman Desktop with Podman 5.2.0 or above and run a podman machine with libkrun support.
For a more technical TLDR it is:
Source code: In order for this to work, a patched version of mesa / vulkan is used. The source for this is located here: https://download.copr.fedorainfracloud.org/results/slp/mesa-krunkit/fedora-39-aarch64/07045714-mesa/mesa-23.3.5-102.src.rpm
The following patch is applied from within the source code to get the patched mesa / vulkan to work correctly: 0001-virtio-vulkan-force-16k-alignment-for-allocations-HA.patch
Running:
podman run -d \
-p 6080:6080 \
--device /dev/dri
vulkan-mac-silicon-gpu-fractals
Then visit http://localhost:6080 in your browser. Install necessary packages for Node.js, Vulkan tools, CMake, and the build environment Download the vulkan stress test Run the vulkan stress test
IMPORTANT NOTE: NOTE: This DOES NOT WORK FOR GPU until vulkan supports NON COMPUTE WORKLOADS. this is just a "scratchpad" for testing vkcube, but unfortunately I did not realize it was NOT a compute-based workload and more support is needed for display / GPU workloads. For now (see startup.sh) we are using the CPU for rendering. by supplying the VK_ICD_FILENAMES env var to the vulkan loader.
Description:
This is a "hello world" GPU container that showcases how we can use the Mac Silicon GPU within a container via showing the standard vkcube demo.
Technical Description: You must use Podman Desktop with Podman 5.2.0 or above and run a podman machine with libkrun support.
For a more technical TLDR it is:
Source code: In order for this to work, a patched version of mesa / vulkan is used. The source for this is located here: https://download.copr.fedorainfracloud.org/results/slp/mesa-krunkit/fedora-39-aarch64/07045714-mesa/mesa-23.3.5-102.src.rpm
The following patch is applied from within the source code to get the patched mesa / vulkan to work correctly: 0001-virtio-vulkan-force-16k-alignment-for-allocations-HA.patch
Running:
podman run -d \
-p 6080:6080 \
--device /dev/dri
vulkan-mac-silicon-gpu-vkcube
Then visit http://localhost:6080 in your browser.