Files
gourichon_org/tools/containers_check_update_rebuild_switch.sh
2025-09-05 22:55:44 +02:00

57 lines
1.6 KiB
Bash
Executable File

#!/bin/bash
set -eu
function fail_one()
{
echo >&2 "FAILURE when processing $CONTAINER_ID ($NAME_OF_CONTAINER), step: " "$@"
RC=1
}
cd -P "$(dirname "$(readlink -f "$0")" )"
if [[ "$PWD" != "$(printf %q "$PWD" )" ]]
then
echo >&2 "WARNING: path seems unsafe: $PWD"
fi
SCRIPT_ROOT="$PWD"
cd ..
INFRA_ROOT="$PWD"
CONTAINER_IDS=( "$@" )
if [[ "${#CONTAINER_IDS[@]}" == 0 ]]
then
echo "No container ID supplied on command line, doing them all."
mapfile -t CONTAINER_IDS < <( podman ps --format "{{.ID}}" )
fi
RC=0
echo Will process these containers:
printf '%s\n' "${CONTAINER_IDS[@]}"
for CONTAINER_ID in "${CONTAINER_IDS[@]}"
do
echo "Processing $CONTAINER_ID"
TMPFILE=$(mktemp)
podman exec -u root $CONTAINER_ID bash -c "export LC_ALL=C ; apt-get update ; apt-get upgrade -y --dry-run" | tee $TMPFILE
trap "rm $TMPFILE" EXIT
if grep "0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." $TMPFILE
then
echo "No update needed."
continue
fi
PATH_OF_CONTAINER="$( podman inspect --format='{{ index .Config.Labels "com.docker.compose.project.working_dir" }}' $CONTAINER_ID )"
NAME_OF_CONTAINER="$( podman inspect --format='{{ .Name }}' $CONTAINER_ID )"
echo "IMPORTANT: building a new, up-to-date, container $NAME_OF_CONTAINER from $PATH_OF_CONTAINER"
cd $PATH_OF_CONTAINER
podman-compose --no-ansi pull || { fail_one "pull" ; continue ; }
podman-compose --no-ansi build --no-cache || { fail_one "build" ; continue ; }
podman-compose --no-ansi up -d || { fail_one "switch to newly built container" ; continue ; }
done