diff --git a/README.md b/README.md index 31bfef3..2fa9c3f 100644 --- a/README.md +++ b/README.md @@ -17,12 +17,14 @@ ___ ## :bell: Changelog + +- **v0.3.7**: Added support for [labels](#labels), added the `-f` option (force restart stack). - **v0.3.6**: Added pushbullet template. - **v0.3.5**: Added a simple progress bar for the registry checkup. - **v0.3.4**: Added ntfy.sh template and error message on registry fail. - **v0.3.3**: Added Apprise template and the option `-i` inform - to send notifications. - **v0.3.2**: Added a notify function to wrap a notify-script, currently DSM/Ssmtp + template script. -- **v0.3.1**: Addded option `-m` , monochrome mode - no printf color codes. + ___ ## :nut_and_bolt: Dependencies @@ -38,22 +40,25 @@ ___ ## :mag_right: `dockcheck.sh` ``` $ ./dockcheck.sh -h - Syntax: dockcheck.sh [OPTION] [part of name to filter] - Example: dockcheck.sh -y -d 10 -e nextcloud,heimdall - - Options: - -a|y Automatic updates, without interaction. - -d N Only update to new images that are N+ days old. Lists too recent with +prefix and age. 2xSlower. - -e X Exclude containers, separated by comma. - -h Print this Help. - -i Inform - send a preconfigured notification. - -m Monochrome mode, no printf color codes. - -n No updates, only checking availability. - -p Auto-Prune dangling images after update. - -r Allow updating images for docker run, wont update the container. - -s Include stopped containers in the check. (Logic: docker ps -a) +Syntax: dockcheck.sh [OPTION] [part of name to filter] +Example: dockcheck.sh -y -d 10 -e nextcloud,heimdall + +Options:" +-a|y Automatic updates, without interaction. +-d N Only update to new images that are N+ days old. Lists too recent with +prefix and age. 2xSlower. +-e X Exclude containers, separated by comma. +-f Force stack restart after update. Caution: restarts once for every updated container within stack. +-h Print this Help. +-i Inform - send a preconfigured notification. +-l Only update if label is set. See readme. +-m Monochrome mode, no printf color codes. +-n No updates, only checking availability. +-p Auto-Prune dangling images after update. +-r Allow updating images for docker run, wont update the container. +-s Include stopped containers in the check. (Logic: docker ps -a). ``` + ### Basic example: ``` $ ./dockcheck.sh @@ -90,6 +95,16 @@ Current templates: Further additions are welcome - suggestions or PR! Initiated and first contributed by [yoyoma2](https://github.com/yoyoma2). +## :bookmark: Labels +Optionally add labels to compose-files. Currently these are the usable labels: +``` + labels: + mag37.dockcheck.restart-stack: true + mag37.dockcheck.update: true +``` +- `mag37.dockcheck.restart-stack: true` works instead of the `-f` option, forcing stop+restart on the whole compose-stack (Caution: Will restart on every updated container within stack). +- `mag37.dockcheck.update: true` will when used with the `-l` option only update containers with this label and skip the rest. Will still list updates as usual. + ## :roller_coaster: Workaround for non **amd64** / **arm64** `regctl` provides binaries for amd64/arm64, to use on other architecture you could try this workaround. Run regctl in a container wrapped in a shell script. Copied from [regclient/docs/install.md](https://github.com/regclient/regclient/blob/main/docs/install.md): @@ -123,7 +138,7 @@ Containers need to be manually stopped, removed and created again to run on the ## :scroll: License dockcheck is created and released under the [GNU GPL v3.0](https://www.gnu.org/licenses/gpl-3.0-standalone.html) license. -### :floppy_disk: The [story](https://mag37.org/posts/project_dockcheck/) behind it. 1 year in the mirror. +### :floppy_disk: The [story](https://mag37.org/posts/project_dockcheck/) behind it. 1 year in retrospect. ___ diff --git a/dockcheck.sh b/dockcheck.sh index 4abfb63..f92bdd2 100755 --- a/dockcheck.sh +++ b/dockcheck.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -VERSION="v0.3.6" -### ChangeNotes: Added a Pushbullet template. +VERSION="v0.3.7" +### ChangeNotes: Added label support (see readme) and -f (force restart stack) option. Github="https://github.com/mag37/dockcheck" RawUrl="https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh" @@ -24,8 +24,10 @@ Help() { echo "-a|y Automatic updates, without interaction." echo "-d N Only update to new images that are N+ days old. Lists too recent with +prefix and age. 2xSlower." echo "-e X Exclude containers, separated by comma." + echo "-f Force stack restart after update. Caution: restarts once for every updated container within stack." echo "-h Print this Help." echo "-i Inform - send a preconfigured notification." + echo "-l Only update if label is set. See readme." echo "-m Monochrome mode, no printf color codes." echo "-n No updates, only checking availability." echo "-p Auto-Prune dangling images after update." @@ -42,12 +44,14 @@ c_teal="\033[0;36m" c_reset="\033[0m" Stopped="" -while getopts "aynprhisme:d:" options; do +while getopts "aynpfrhlisme:d:" options; do case "${options}" in a|y) AutoUp="yes" ;; n) AutoUp="no" ;; r) DRunUp="yes" ;; p) AutoPrune="yes" ;; + l) OnlyLabel=true ;; + f) ForceRestartStacks=true ;; i) [ -s $ScriptWorkDir/notify.sh ] && { source $ScriptWorkDir/notify.sh ; Notify="yes" ; } ;; e) Exclude=${OPTARG} ;; m) declare c_{red,green,yellow,blue,teal,reset}="" ;; @@ -275,6 +279,8 @@ if [ -n "$GotUpdates" ] ; then ContName=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.service" }}') ContEnv=$(docker inspect "$i" --format '{{index .Config.Labels "com.docker.compose.project.environment_file" }}') ContImage=$(docker inspect "$i" --format='{{.Config.Image}}') + ContUpdateLabel=$(docker inspect "$i" --format '{{ index .Config.Labels "mag37.dockcheck.update" }}') + ContRestartStack=$(docker inspect "$i" --format '{{ index .Config.Labels "mag37.dockcheck.restart-stack" }}') ### Checking if compose-values are empty - hence started with docker run: if [ -z "$ContPath" ] ; then if [ "$DRunUp" == "yes" ] ; then @@ -294,16 +300,25 @@ if [ -n "$GotUpdates" ] ; then ### cd to the compose-file directory to account for people who use relative volumes, eg - ${PWD}/data:data cd "$ContPath" || { echo "Path error - skipping $i" ; continue ; } printf "\n%bNow updating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset" + ### Checking if Label Only -option is set, and if container got the label + [[ "$OnlyLabel" == true ]] && { [[ "$ContUpdateLabel" != true ]] && { echo "No label, skipping" ; continue ; } } docker pull "$ContImage" ### Reformat for multi-compose: IFS=',' read -r -a Confs <<< "$ComposeFile" ; unset IFS for conf in "${Confs[@]}"; do CompleteConfs+="-f $conf " ; done - ### Check if the container got an environment file set, use it if so: - if [ -n "$ContEnv" ]; then - $DockerBin ${CompleteConfs[@]} --env-file "$ContEnv" up -d "$ContName" # unquoted array to allow split - rework? + if [ -n "$ContEnv" ]; then # also checking if stack should be restarted + if [[ "$ContRestartStack" == true ]] || [[ "$ForceRestartStacks" == true ]] ; then + $DockerBin ${CompleteConfs[@]} stop ; $DockerBin ${CompleteConfs[@]} --env-file "$ContEnv" up -d + else + $DockerBin ${CompleteConfs[@]} --env-file "$ContEnv" up -d "$ContName" # unquoted array to allow split - rework? + fi else - $DockerBin ${CompleteConfs[@]} up -d "$ContName" # unquoted array to allow split - rework? + if [[ "$ContRestartStack" == true ]] || [[ "$ForceRestartStacks" == true ]] ; then + $DockerBin ${CompleteConfs[@]} stop ; $DockerBin ${CompleteConfs[@]} up -d + else + $DockerBin ${CompleteConfs[@]} up -d "$ContName" + fi fi done printf "\n%bAll done!%b\n" "$c_green" "$c_reset"