From 48f13d622b28ceb8aa0f69b8304347a01914c11a Mon Sep 17 00:00:00 2001 From: Job79 Date: Fri, 29 Aug 2025 13:46:15 +0200 Subject: [PATCH] chore: sync from github --- Containerfile | 31 --------- config/nvim/config/keymaps.lua | 16 ----- config/nvim/config/lazy.lua | 43 ------------ config/nvim/config/options.lua | 15 ----- config/nvim/lazyvim.json | 12 ---- config/nvim/plugins/colorscheme.lua | 9 --- config/nvim/plugins/disabled.lua | 25 ------- config/user/profile | 7 -- containers/base/Containerfile | 20 ++++++ .../user => containers/base/config}/bashrc | 9 ++- containers/base/config/bin/host | 6 ++ containers/base/config/bin/podman | 1 + containers/base/config/bin/xdg-open | 1 + containers/go/Containerfile | 4 ++ containers/go/config.sh | 3 + containers/kube/Containerfile | 4 ++ containers/kube/config.sh | 3 + enter.sh | 67 +++++++++++-------- state/last-name | 1 + state/registry | 1 + 20 files changed, 92 insertions(+), 186 deletions(-) delete mode 100644 Containerfile delete mode 100644 config/nvim/config/keymaps.lua delete mode 100644 config/nvim/config/lazy.lua delete mode 100644 config/nvim/config/options.lua delete mode 100644 config/nvim/lazyvim.json delete mode 100644 config/nvim/plugins/colorscheme.lua delete mode 100644 config/nvim/plugins/disabled.lua delete mode 100644 config/user/profile create mode 100644 containers/base/Containerfile rename {config/user => containers/base/config}/bashrc (58%) create mode 100755 containers/base/config/bin/host create mode 120000 containers/base/config/bin/podman create mode 120000 containers/base/config/bin/xdg-open create mode 100644 containers/go/Containerfile create mode 100644 containers/go/config.sh create mode 100644 containers/kube/Containerfile create mode 100644 containers/kube/config.sh create mode 100644 state/last-name create mode 100644 state/registry diff --git a/Containerfile b/Containerfile deleted file mode 100644 index f471ca3..0000000 --- a/Containerfile +++ /dev/null @@ -1,31 +0,0 @@ -# ========================================= # -# Containerfile v1.0; job79 # -# Configure and setup a neovim devcontainer # -# for go and nodejs development. # -# ========================================= # -FROM quay.io/fedora/fedora:41 - -# === setup system === -RUN dnf update -y && \ - dnf copr enable -y atim/lazygit && \ - dnf -y install neovim unzip \ - bash-completion zoxide fd-find chafa lazygit procps \ - git go npm - -# === setup container user === -RUN useradd -ms /bin/bash user && usermod -aG wheel user && sed -i '/NOPASSWD/s/^#//g' /etc/sudoers -RUN mkdir /run/user/1000 && chown user:user /run/user/1000 -USER user -WORKDIR /home/user -COPY config/user/bashrc /home/user/.bashrc -COPY config/user/profile /home/user/.bash_profile - -# === setup neovim === -RUN git clone --depth 1 https://github.com/LazyVim/starter ~/.config/nvim -COPY --chown=user:user config/nvim/plugins /home/user/.config/nvim/lua/plugins -COPY --chown=user:user config/nvim/config /home/user/.config/nvim/lua/config -COPY --chown=user:user config/nvim/lazyvim.json /home/user/.config/nvim/lazyvim.json - -# === setup container === -ENV TZ="Europe/Amsterdam" -VOLUME /home/user/.local /home/user/.cache diff --git a/config/nvim/config/keymaps.lua b/config/nvim/config/keymaps.lua deleted file mode 100644 index eb43eda..0000000 --- a/config/nvim/config/keymaps.lua +++ /dev/null @@ -1,16 +0,0 @@ --- Configure custom keymaps. -local keymap = vim.keymap.set -local delkeymap = vim.keymap.del -local opts = { noremap = true, silent = true } - --- Improved line start/end -keymap({ "n", "v" }, "H", "^", opts) -keymap({ "n", "v" }, "L", "$", opts) - --- Improved escape -keymap("n", "", ":noh", opts) -keymap("t", "", "", opts) - --- Disable alt j/k to move lines (conflict with default vim motions) -delkeymap({ "i", "v" }, "") -delkeymap({ "i", "v" }, "") diff --git a/config/nvim/config/lazy.lua b/config/nvim/config/lazy.lua deleted file mode 100644 index ede6149..0000000 --- a/config/nvim/config/lazy.lua +++ /dev/null @@ -1,43 +0,0 @@ -local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" -if not (vim.uv or vim.loop).fs_stat(lazypath) then - local lazyrepo = "https://github.com/folke/lazy.nvim.git" - local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) - if vim.v.shell_error ~= 0 then - vim.api.nvim_echo({ - { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, - { out, "WarningMsg" }, - { "\nPress any key to exit..." }, - }, true, {}) - vim.fn.getchar() - os.exit(1) - end -end -vim.opt.rtp:prepend(lazypath) - -require("lazy").setup({ - spec = { - { "LazyVim/LazyVim", import = "lazyvim.plugins" }, - { import = "plugins" }, - }, - defaults = { - lazy = false, - version = false, - }, - install = {}, - checker = { - enabled = true, - notify = true, - }, - performance = { - rtp = { - disabled_plugins = { - "gzip", - "netrwPlugin", - "tarPlugin", - "tohtml", - "tutor", - "zipPlugin", - }, - }, - }, -}) diff --git a/config/nvim/config/options.lua b/config/nvim/config/options.lua deleted file mode 100644 index ffe07c0..0000000 --- a/config/nvim/config/options.lua +++ /dev/null @@ -1,15 +0,0 @@ --- Set some custom options. -local opt = vim.o -local global = vim.g - --- Set target text width for gww to 60. -opt.tw = 60 - --- Use the internal clipboard. -opt.clipboard = "" - --- Use original gruvbox theme. -global.gruvbox_material_foreground = "original" - --- Disable snack animations. -global.snacks_animate = false diff --git a/config/nvim/lazyvim.json b/config/nvim/lazyvim.json deleted file mode 100644 index 32e2dc8..0000000 --- a/config/nvim/lazyvim.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extras": [ - "lazyvim.plugins.extras.ai.copilot", - "lazyvim.plugins.extras.dap.core", - "lazyvim.plugins.extras.lang.go", - "lazyvim.plugins.extras.lang.svelte", - "lazyvim.plugins.extras.lang.tailwind", - "lazyvim.plugins.extras.lang.typescript", - "lazyvim.plugins.extras.test.core" - ], - "version": 7 -} diff --git a/config/nvim/plugins/colorscheme.lua b/config/nvim/plugins/colorscheme.lua deleted file mode 100644 index ac12a3c..0000000 --- a/config/nvim/plugins/colorscheme.lua +++ /dev/null @@ -1,9 +0,0 @@ --- Configure rose-pine and gruvbox-material colorschemes. -return { - { "rose-pine/neovim", name = "rose-pine" }, - { "sainnhe/gruvbox-material" }, - { - "LazyVim/LazyVim", - opts = { colorscheme = "gruvbox-material" }, - }, -} diff --git a/config/nvim/plugins/disabled.lua b/config/nvim/plugins/disabled.lua deleted file mode 100644 index 999edb1..0000000 --- a/config/nvim/plugins/disabled.lua +++ /dev/null @@ -1,25 +0,0 @@ --- Disable unused plugins and functionality. -return { - { - -- Disable the dashboard. - "folke/snacks.nvim", - opts = { - dashboard = { enabled = false }, - notifier = { level = vim.log.levels.WARN }, - }, - }, - { - -- Disable inline hints by default. - "neovim/nvim-lspconfig", - opts = { - inlay_hints = { enabled = false }, - }, - }, - - -- Disable unused plugins. - { "folke/flash.nvim", enabled = false }, - { "folke/todo-comments.nvim", enabled = false }, - { "folke/trouble.nvim", enabled = false }, - { "MagicDuck/grug-far.nvim", enabled = false }, - { "akinsho/bufferline.nvim", enabled = false }, -} diff --git a/config/user/profile b/config/user/profile deleted file mode 100644 index 683af33..0000000 --- a/config/user/profile +++ /dev/null @@ -1,7 +0,0 @@ -. ~/.bashrc - -# === persist copilot auth files inside .local volume === -if [ ! -d ~/.config/github-copilot ]; then - mkdir -p ~/.local/share/github-copilot - ln -s ~/.local/share/github-copilot ~/.config -fi diff --git a/containers/base/Containerfile b/containers/base/Containerfile new file mode 100644 index 0000000..8252f6a --- /dev/null +++ b/containers/base/Containerfile @@ -0,0 +1,20 @@ +FROM quay.io/fedora/fedora:42 + +# === install system packages === +RUN dnf update -y && \ + dnf copr enable -y atim/lazygit && \ + dnf -y install procps ping bash-completion glibc-langpack-en \ + host-spawn dbus-launch \ + zoxide git npm neovim awk jq unzip fd-find chafa lazygit + +# === setup user === +RUN useradd -ms /bin/bash user && \ + usermod -aG wheel user && sed -i '/NOPASSWD/s/^#//g' /etc/sudoers && \ + mkdir -p /run/user/1000 && chown user:user /run/user/1000 + +USER user +WORKDIR /home/user +RUN mkdir .config .local .cache +COPY --chown=user:user config/bashrc .bashrc +COPY config/bin /usr/local/bin +VOLUME /home/user diff --git a/config/user/bashrc b/containers/base/config/bashrc similarity index 58% rename from config/user/bashrc rename to containers/base/config/bashrc index a176a76..0deba25 100644 --- a/config/user/bashrc +++ b/containers/base/config/bashrc @@ -1,14 +1,21 @@ . /etc/bashrc +# === container enter logic - cd to ENTER_DIR === +ENTER_DIR="${ENTER_DIR/#\~/$HOME}" +[ -d "$ENTER_DIR" ] && cd "$ENTER_DIR" + # === environment === export EDITOR=nvim \ WAYLAND_DISPLAY=wayland-0 \ XDG_RUNTIME_DIR=/run/user/1000 \ SSH_AUTH_SOCK=/run/user/1000/ssh-auth-sock \ - PS1='\[\e[30;46m\] container | \w \[\e[0;36m\]\[\e[m\] ' + DBUS_SESSION_BUS_ADDRESS="unix:path=/tmp/bus" \ + PS1="\[\e[30;46m\] \h | \w \[\e[0;36m\]\[\e[m\] " \ + TZ="Europe/Amsterdam" # === aliases and functions === alias vi=nvim post() { curl -sF "content=<-" "https://paste.plabble.org/$2?lang=$1" && echo; } + eval "$(zoxide init --cmd cd bash)" eval "$(fzf --bash)" diff --git a/containers/base/config/bin/host b/containers/base/config/bin/host new file mode 100755 index 0000000..19c9db1 --- /dev/null +++ b/containers/base/config/bin/host @@ -0,0 +1,6 @@ +#!/bin/bash +if [ "$(basename "$0")" != "host" ]; then + host-spawn -cwd "${PWD/#$HOME/$HOST_HOME}" $(basename "$0") "$@" +else + host-spawn -cwd "${PWD/#$HOME/$HOST_HOME}" "$@" +fi diff --git a/containers/base/config/bin/podman b/containers/base/config/bin/podman new file mode 120000 index 0000000..fe198d7 --- /dev/null +++ b/containers/base/config/bin/podman @@ -0,0 +1 @@ +host \ No newline at end of file diff --git a/containers/base/config/bin/xdg-open b/containers/base/config/bin/xdg-open new file mode 120000 index 0000000..fe198d7 --- /dev/null +++ b/containers/base/config/bin/xdg-open @@ -0,0 +1 @@ +host \ No newline at end of file diff --git a/containers/go/Containerfile b/containers/go/Containerfile new file mode 100644 index 0000000..735ec5c --- /dev/null +++ b/containers/go/Containerfile @@ -0,0 +1,4 @@ +FROM ghcr.io/job79/base:latest +USER root +RUN dnf -y install go +USER user diff --git a/containers/go/config.sh b/containers/go/config.sh new file mode 100644 index 0000000..923eea6 --- /dev/null +++ b/containers/go/config.sh @@ -0,0 +1,3 @@ +for dir in "Code" "Documents" "Downloads" ".config/devcontainer"; do + arg "-v $HOME/$dir:/home/user/$dir" +done diff --git a/containers/kube/Containerfile b/containers/kube/Containerfile new file mode 100644 index 0000000..a3f49a0 --- /dev/null +++ b/containers/kube/Containerfile @@ -0,0 +1,4 @@ +FROM ghcr.io/job79/base:latest +USER root +RUN dnf -y install kubectl +USER user diff --git a/containers/kube/config.sh b/containers/kube/config.sh new file mode 100644 index 0000000..32ff678 --- /dev/null +++ b/containers/kube/config.sh @@ -0,0 +1,3 @@ +for dir in "Code" "Downloads" ".config/devcontainer"; do + arg "-v $HOME/$dir:/home/user/$dir" +done diff --git a/enter.sh b/enter.sh index 7c16fdf..c2d6d66 100755 --- a/enter.sh +++ b/enter.sh @@ -1,29 +1,36 @@ -#!/bin/sh +#!/bin/bash # =============================================== # -# enter.sh v1.0; job79 # -# Enter into an existing or new dev container and # -# automatically handle dev container updates. # +# enter.sh v2.0; job79 # +# Dev container enter script. Handles setting up # +# different dev containers, resuming sessions and # +# automatic container updates. # # =============================================== # set -eu log() { printf '\e[%sm%s\e[0m %s\n' "${3:-36}" "${2:-○}" "$1"; } arg() { echo -n " $@"; } -# run_args returns the arguments required for the podman run -# command. +# run_args returns the podman run arguments required for +# starting a new container. run_args() { arg "--name $name" - # Disable some security settings to make it possible to - # mount host directories without problems. + # Disable some security settings so host directories can + # be mounted without problems. arg "--security-opt label=disable" # disable labeling so mounts don't need to be labeled. arg "--userns=keep-id" # required for ~/.ssh which is usually 700. + # Configure options to get host-spawn to work inside the + # container. + [ -e "/run/user/$UID/bus" ] && arg "-v /run/user/$UID/bus:/tmp/bus" # Use host dbus. + arg "-e HOST_HOME=$HOME" # Used to translate container path to host. + # Use host networking. arg "--net=host" # Mount the wayland socket. Required to get the system - # clipbard (wl-copy) working. + # clipbard (wl-copy) and gui applications working. [ -e "/run/user/$UID/wayland-0" ] && arg "-v /run/user/$UID/wayland-0:/run/user/1000/wayland-0" + arg "--device /dev/dri" # mount gpu devices for gpu acceleration. # Mount the ssh socket, directory and the git config # directory. This gets the host ssh and git configuration @@ -32,41 +39,47 @@ run_args() { [ -d "$HOME/.ssh" ] && arg "-v $HOME/.ssh:/home/user/.ssh" [ -d "$HOME/.config/git" ] && arg "-v $HOME/.config/git:/home/user/.config/git" - # Mount host directories with programming projects. - [ -d "$HOME/Code" ] && arg "-v $HOME/Code:/home/user/Code" - [ -d "$HOME/.config/devcontainer" ] && arg "-v $HOME/.config/devcontainer:/home/user/.dev" + # Add a volume for the home directory so it survives + # container updates. + arg "-v $name:/home/user:copy" - # Add volumes for .local and .cache so these survive - # container restarts. - arg "-v $name-local:/home/user/.local" - arg "-v $name-cache:/home/user/.cache" + # Add custom user configuration. + config_file="$script_dir/containers/$name/config.sh" + [ -f "${config_file}" ] && source "${config_file}" } ### MAIN ### -name="dev" -image="git.plabble.org/job79/devcontainer:latest" -fetch=false +script_dir="$(dirname "$(realpath "$0")")" +name=$(<"$script_dir/state/last-name") +registry=$(<"$script_dir/state/registry") +pull=false while test $# -gt 0; do case "$1" in - --image | -i) shift && fetch=true && image="$1" ;; - --fetch | -f) fetch=true ;; + -p) pull=true ;; -*) log "unknown argument '$1'" 'x' 31 ;; - *) name="$1" ;; + *) + name="$1" + echo "$1" >"$script_dir/state/last-name" + ;; esac shift done -if [ "$fetch" = true ] || [ "$(podman container inspect "$name" -f {{.State.Running}} 2>&1)" != 'true' ]; then +if [ "$(podman container inspect "$name" -f {{.State.Running}} 2>&1)" != 'true' ] || [ "$pull" = true ]; then log "fetching devcontainer updates..." - if [ "$(podman pull -q "$image" 2>&1)" != "$(podman container inspect "$name" -f {{.Image}} 2>&1)" ]; then - log "container image downloaded" '✓' 32 + if [ "$(podman container inspect "$name" -f {{.Image}} 2>&1)" != "$(podman pull -q "$registry/$name" 2>&1)" ] || [ "$pull" = true ]; then + if [ $? -eq 0 ]; then + log "container image downloaded" '✓' 32 + else + log "failed to download container image" 'x' 31 + fi podman container rm -f -t 1 "$name" 1>/dev/null - podman run -td $(run_args) "$image" + podman run -td $(run_args) "$registry/$name" else log "no updates available" '✓' 32 fi fi podman start "$name" 1>/dev/null -podman exec --detach-keys "" -it "$name" bash -l +podman exec -e ENTER_DIR="${PWD/#$HOME/\~}" --detach-keys "ctrl-@" -it "$name" bash -l diff --git a/state/last-name b/state/last-name new file mode 100644 index 0000000..4023f20 --- /dev/null +++ b/state/last-name @@ -0,0 +1 @@ +go diff --git a/state/registry b/state/registry new file mode 100644 index 0000000..25e26d3 --- /dev/null +++ b/state/registry @@ -0,0 +1 @@ +ghcr.io/job79