From 31502c8aab29bcd736c1cbcb074efd76a9b04058 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sat, 27 Jan 2024 07:05:12 +0100 Subject: [PATCH] confd: add support for upgrading container images This patch adds a new CLI command 'container upgrade foo', where 'foo' is the name of the container. If more than one container use the same image, multiple upgrades must be done because a container runs not on the 'image:tag' but on the hash of the 'image:tag' it was created from. Rename "done" queue to "active", since we want to recreate an active container after fetching an updated base image. Signed-off-by: Joachim Wiberg --- board/common/rootfs/usr/sbin/container | 11 +++++++++++ package/execd/execd.conf | 2 +- package/execd/tmpfiles.conf | 2 +- src/confd/src/infix-containers.c | 8 ++++---- src/klish-plugin-infix/xml/infix.xml | 7 +++++++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/board/common/rootfs/usr/sbin/container b/board/common/rootfs/usr/sbin/container index 12c836b0..23521d65 100755 --- a/board/common/rootfs/usr/sbin/container +++ b/board/common/rootfs/usr/sbin/container @@ -246,6 +246,17 @@ case $cmd in stop) initctl -bq stop "container:$1" || podman kill "$1" ;; + upgrade) + img=$(podman inspect "$1" | jq -r .[].ImageName) + if [ -z "$img" ]; then + echo "No such container ($1), or invalid ImageName. Cannot upgrade." + exit 1; + fi + podman stop "$1" + podman pull "$img" || (echo "Failed fetching $img, check your network (settings)."; exit 1) + "/var/lib/containers/active/${1}.sh" || (echo "Failed recreating container $1"; exit 1) + echo "Container $1 recreated, restart with 'container start $1'" + ;; volume) cmd=$1 shift diff --git a/package/execd/execd.conf b/package/execd/execd.conf index cd9c0176..54978b51 100644 --- a/package/execd/execd.conf +++ b/package/execd/execd.conf @@ -1,2 +1,2 @@ service log:prio:local1.err,tag:container \ - [2345] execd /run/containers/queue /var/lib/containers/done -- Container job runner + [2345] execd /run/containers/queue /var/lib/containers/active -- Container job runner diff --git a/package/execd/tmpfiles.conf b/package/execd/tmpfiles.conf index 1cf96006..0f2b116a 100644 --- a/package/execd/tmpfiles.conf +++ b/package/execd/tmpfiles.conf @@ -1,5 +1,5 @@ d /run/containers/args 0700 - - -d /var/lib/containers/done 0700 - - +d /var/lib/containers/active 0700 - - d /run/containers/inbox 0700 - - d /run/containers/queue 0700 - - d /run/cni 0755 - - diff --git a/src/confd/src/infix-containers.c b/src/confd/src/infix-containers.c index 95f8a022..6e9dbdfa 100644 --- a/src/confd/src/infix-containers.c +++ b/src/confd/src/infix-containers.c @@ -19,7 +19,7 @@ #define CFG_XPATH "/infix-containers:container" #define INBOX_QUEUE "/run/containers/inbox" #define JOB_QUEUE "/run/containers/queue" -#define DONE_QUEUE "/var/lib/containers/done" +#define ACTIVE_QUEUE "/var/lib/containers/active" #define LOGGER "logger -t container -p local1.notice" static const struct srx_module_requirement reqs[] = { @@ -231,13 +231,13 @@ void infix_containers_launch(void) } while ((d = readdir(dir))) { + char curr[strlen(ACTIVE_QUEUE) + strlen(d->d_name) + 2]; char next[strlen(INBOX_QUEUE) + strlen(d->d_name) + 2]; - char curr[strlen(DONE_QUEUE) + strlen(d->d_name) + 2]; + snprintf(curr, sizeof(curr), "%s/%s", ACTIVE_QUEUE, d->d_name); snprintf(next, sizeof(next), "%s/%s", INBOX_QUEUE, d->d_name); - snprintf(curr, sizeof(curr), "%s/%s", DONE_QUEUE, d->d_name); if (!systemf("cmp %s %s", curr, next)) { - ERRNO("New job %s is already done, no changes, skipping.", next); + ERRNO("New job %s is already active, no changes, skipping.", next); systemf("initctl -nbq cond set container:$(basename %s .sh)", d->d_name); remove(next); continue; diff --git a/src/klish-plugin-infix/xml/infix.xml b/src/klish-plugin-infix/xml/infix.xml index c74abe7d..f7b1b45b 100644 --- a/src/klish-plugin-infix/xml/infix.xml +++ b/src/klish-plugin-infix/xml/infix.xml @@ -245,6 +245,13 @@ container stop $KLISH_PARAM_name + + + + + container upgrade $KLISH_PARAM_name + +