From 63ac1aae830242867f331a79bf3f9589f7a7fb17 Mon Sep 17 00:00:00 2001 From: Job79 Date: Sun, 29 Sep 2024 16:48:50 +0200 Subject: [PATCH] feat: handle automatically updates with enter.sh --- build.sh | 2 +- enter.sh | 109 +++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 94 insertions(+), 17 deletions(-) diff --git a/build.sh b/build.sh index 4944990..be40679 100755 --- a/build.sh +++ b/build.sh @@ -1,2 +1,2 @@ #!/bin/sh -podman build . -t dev +podman build . $@ -t git.plabble.org/job79/dev diff --git a/enter.sh b/enter.sh index 62874ca..20a47cb 100755 --- a/enter.sh +++ b/enter.sh @@ -1,17 +1,94 @@ #!/bin/sh -name="${1:-dev}" -podman container rm -f -t 1 "$name" -podman pull git.plabble.org/job79/dev:latest -podman run -it \ - --name "$name" \ - -v /run/user/1000/wayland-0:/run/user/1000/wayland-0 \ - -v "$SSH_AUTH_SOCK":/run/user/1000/ssh-auth-sock \ - -v ~/Documents:/home/user/Documents \ - -v ~/.ssh:/home/user/.ssh \ - -v ~/.config/git:/home/user/.config/git \ - -v "$name"-copilot:/home/user/.config/github-copilot \ - -v "$name"-local:/home/user/.local \ - -v "$name"-cache:/home/user/.cache \ - --security-opt label=disable \ - --userns=keep-id \ - git.plabble.org/job79/dev:latest +# =============================================== # +# enter.sh v1.0; job79 # +# Enter into an existing or new dev container and # +# automatically handle dev container updates. # +# =============================================== # +set -e + +# podman_run opens a shell into a newly created dev container. +podman_run() { + args="--name $name" + arg() { args="$args $@"; } + + # Automatically update the container when a newer + # image is available. + [ "$no_pull" = 1 ] || arg "--pull newer" + + # Disable some security settings to make it possible to mount + # host directories without problems. + arg "--security-opt label=disable" # disable labeling so mounts don't need to be labbeled. + arg "--userns=keep-id" # required for ~/.ssh which is usually 700. + + # Mount the wayland socket. Required to get the system + # clipbard (wl-copy) working. + arg "-v /run/user/$UID/wayland-0:/run/user/1000/wayland-0" + + # Mount the ssh socket, directory and git directory. This + # gets the host ssh and git configuration working inside + # the container. + arg "-v $SSH_AUTH_SOCK:/run/user/1000/ssh-auth-sock" + [ -d ~/.ssh ] && arg "-v $HOME/.ssh:/home/user/.ssh" + [ -d ~/.config/git ] && arg "-v $HOME/.config/git:/home/user/.config/git" + + # Mount host directories with programming projects. + [ -d ~/Documents ] && arg "-v $HOME/Documents:/home/user/Documents" + [ -d ~/.dev ] && arg "-v $HOME/.dev:/home/user/.dev" + + # 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" + podman run -it $args "$image" +} + +# podman_exec opens a shell into an existing dev container. +podman_exec() { podman exec -it "$name" bash -l; } + +# podman_start starts a stopped existing dev container. +podman_start() { podman start "$name" 1>/dev/null; } + +# podman_delete deletes a dev container. +podman_delete() { podman container rm -f -t 1 "$name" 1>/dev/null; } + +### MAIN ### +name="dev" +image="git.plabble.org/job79/dev:latest" + +while test $# -gt 0; do + case "$1" in + --recreate | -r) podman_delete ;; + --no-pull | -np) no_pull=1 ;; + -*) echo "unknown option '$1'" ;; + *) name="$1" ;; + esac + shift +done + +if ! podman container exists "$name"; then + podman_run + exit +fi + +if [ "$(podman container inspect "$name" -f {{.State.Running}} 2>&1)" = 'true' ]; then + podman_exec + exit +fi + +if [ "$no_pull" = 1 ]; then + podman_start + podman_exec + exit +fi + +iid="$(podman image inspect "$image" -f {{.Id}})" +podman pull -q "$image" 1>/dev/null +if [ "$(podman image inspect "$image" -f {{.Id}})" != "$iid" ]; then + # When container is stopped and a newer image is available, + # recreate the container instead of starting the existing one. + podman_delete + podman_run +else + podman_start + podman_exec +fi