Merge pull request #109 from mag37/feedback_podcheck

jq rewrite and formatting fixes
This commit is contained in:
mag37 2024-11-20 08:39:30 +01:00 committed by GitHub
commit 09c9faa008
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 93 additions and 67 deletions

View file

@ -13,11 +13,12 @@
<h3 align="center">CLI tool to automate docker image updates. <br>No <b>pre-pull</b>, selective, optional notifications and prune when done.</h3> <h3 align="center">CLI tool to automate docker image updates. <br>No <b>pre-pull</b>, selective, optional notifications and prune when done.</h3>
<h2 align="center">Now with simple notification integrations!</h2> <h2 align="center">Now with simple notification integrations!</h2>
<h4 align="center">With features like excluding specific containers, custom container labels, auto-prune when done and more.</h4> <h4 align="center">With features like excluding specific containers, custom container labels, auto-prune when done and more.</h4>
<h4 align="center">Also see the fresh <a href="https://github.com/sudo-kraken/podcheck">Podman fork!</a></h4> <h4 align="center">Also see the fresh Podman fork <a href="https://github.com/sudo-kraken/podcheck">sudo-kraken/podcheck</a>!</h4>
___ ___
## :bell: Changelog ## :bell: Changelog
- **v0.5.1**: DEPENDENCY WARNING: now requires **jq**. + Upstreaming changes from [sudo-kraken/podcheck](https://github.com/sudo-kraken/podcheck)
- **v0.5.0**: Rewritten notify logic - all templates are adjusted and should be migrated! - **v0.5.0**: Rewritten notify logic - all templates are adjusted and should be migrated!
- Copy the custom settings from your current template to the new version of the same template. - Copy the custom settings from your current template to the new version of the same template.
- Look into, copy and customize the `urls.list` file if that's of interest. - Look into, copy and customize the `urls.list` file if that's of interest.
@ -28,8 +29,6 @@ ___
- **v0.4.8**: Rewrote prune logic to not prompt with options `-a|-y` or `-n`. Auto prune with `-p`. - **v0.4.8**: Rewrote prune logic to not prompt with options `-a|-y` or `-n`. Auto prune with `-p`.
- **v0.4.7**: Notification Template changes to gotify(new!), DSM(improved), SMTP(deprecation alternative). - **v0.4.7**: Notification Template changes to gotify(new!), DSM(improved), SMTP(deprecation alternative).
- **v0.4.6**: Compatibility changes to timeout, due to busybox. - **v0.4.6**: Compatibility changes to timeout, due to busybox.
- **v0.4.5**: Bugfixes, compatibility changes to timeout and arrays.
- **v0.4.3**: Added timeout option to skip container if registry check takes too long (10s default).
___ ___
@ -75,7 +74,7 @@ Containers with updates available:
Choose what containers to update: Choose what containers to update:
Enter number(s) separated by comma, [a] for all - [q] to quit: Enter number(s) separated by comma, [a] for all - [q] to quit:
``` ```
Then it proceedes to run `pull` and `up -d` on every container with updates. Then it proceeds to run `pull` and `up -d` on every container with updates.
After the updates are complete, you'll get prompted if you'd like to prune dangling images. After the updates are complete, you'll get prompted if you'd like to prune dangling images.
___ ___

View file

@ -1,19 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
VERSION="v0.5.0" VERSION="v0.5.1"
### ChangeNotes: Rewritten notify logic - all templates adjusted, transfer your current settings to a new template! See README. # ChangeNotes: DEPENDENCY WARNING: now requires jq. And upstreaming changes from sudo-kraken/podcheck
Github="https://github.com/mag37/dockcheck" Github="https://github.com/mag37/dockcheck"
RawUrl="https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh" RawUrl="https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh"
### Variables for self updating # Variables for self updating
ScriptArgs=( "$@" ) ScriptArgs=( "$@" )
ScriptPath="$(readlink -f "$0")" ScriptPath="$(readlink -f "$0")"
ScriptWorkDir="$(dirname "$ScriptPath")" ScriptWorkDir="$(dirname "$ScriptPath")"
### Check if there's a new release of the script: # Check if there's a new release of the script
LatestRelease="$(curl -s -r 0-50 $RawUrl | sed -n "/VERSION/s/VERSION=//p" | tr -d '"')" LatestRelease="$(curl -s -r 0-50 $RawUrl | sed -n "/VERSION/s/VERSION=//p" | tr -d '"')"
LatestChanges="$(curl -s -r 0-200 $RawUrl | sed -n "/ChangeNotes/s/### ChangeNotes: //p")" LatestChanges="$(curl -s -r 0-200 $RawUrl | sed -n "/ChangeNotes/s/# ChangeNotes: //p")"
### Help Function: # Help Function
Help() { Help() {
echo "Syntax: dockcheck.sh [OPTION] [part of name to filter]" echo "Syntax: dockcheck.sh [OPTION] [part of name to filter]"
echo "Example: dockcheck.sh -y -d 10 -e nextcloud,heimdall" echo "Example: dockcheck.sh -y -d 10 -e nextcloud,heimdall"
@ -27,9 +27,9 @@ Help() {
echo "-i Inform - send a preconfigured notification." echo "-i Inform - send a preconfigured notification."
echo "-l Only update if label is set. See readme." echo "-l Only update if label is set. See readme."
echo "-m Monochrome mode, no printf color codes." echo "-m Monochrome mode, no printf color codes."
echo "-n No updates, only checking availability." echo "-n No updates; only checking availability."
echo "-p Auto-Prune dangling images after update." echo "-p Auto-prune dangling images after update."
echo "-r Allow updating images for docker run, wont update the container." echo "-r Allow updating images for docker run; won't update the container."
echo "-s Include stopped containers in the check. (Logic: docker ps -a)." echo "-s Include stopped containers in the check. (Logic: docker ps -a)."
echo "-t Set a timeout (in seconds) per container for registry checkups, 10 is default." echo "-t Set a timeout (in seconds) per container for registry checkups, 10 is default."
echo "-v Prints current version." echo "-v Prints current version."
@ -37,7 +37,7 @@ Help() {
echo "Project source: $Github" echo "Project source: $Github"
} }
### Colors: # Colors
c_red="\033[0;31m" c_red="\033[0;31m"
c_green="\033[0;32m" c_green="\033[0;32m"
c_yellow="\033[0;33m" c_yellow="\033[0;33m"
@ -68,18 +68,19 @@ while getopts "aynpfrhlisvme:d:t:" options; do
done done
shift "$((OPTIND-1))" shift "$((OPTIND-1))"
# Self-update function
self_update_curl() { self_update_curl() {
cp "$ScriptPath" "$ScriptPath".bak cp "$ScriptPath" "$ScriptPath".bak
if [[ $(builtin type -P curl) ]]; then if [[ $(command -v curl) ]]; then
curl -L $RawUrl > "$ScriptPath" ; chmod +x "$ScriptPath" curl -L $RawUrl > "$ScriptPath" ; chmod +x "$ScriptPath"
printf "\n%s\n" "--- starting over with the updated version ---" printf "\n%s\n" "--- starting over with the updated version ---"
exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
exit 1 # exit the old instance exit 1 # Exit the old instance
elif [[ $(builtin type -P wget) ]]; then elif [[ $(command -v wget) ]]; then
wget $RawUrl -O "$ScriptPath" ; chmod +x "$ScriptPath" wget $RawUrl -O "$ScriptPath" ; chmod +x "$ScriptPath"
printf "\n%s\n" "--- starting over with the updated version ---" printf "\n%s\n" "--- starting over with the updated version ---"
exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
exit 1 # exit the old instance exit 1 # Exit the old instance
else else
printf "curl/wget not available - download the update manually: %s \n" "$Github" printf "curl/wget not available - download the update manually: %s \n" "$Github"
fi fi
@ -87,7 +88,7 @@ self_update_curl() {
self_update() { self_update() {
cd "$ScriptWorkDir" || { printf "Path error, skipping update.\n" ; return ; } cd "$ScriptWorkDir" || { printf "Path error, skipping update.\n" ; return ; }
if [[ $(builtin type -P git) ]] && [[ "$(git ls-remote --get-url 2>/dev/null)" =~ .*"mag37/dockcheck".* ]] ; then if [[ $(command -v git) ]] && [[ "$(git ls-remote --get-url 2>/dev/null)" =~ .*"mag37/dockcheck".* ]] ; then
printf "\n%s\n" "Pulling the latest version." printf "\n%s\n" "Pulling the latest version."
git pull --force || { printf "Git error, manually pull/clone.\n" ; return ; } git pull --force || { printf "Git error, manually pull/clone.\n" ; return ; }
printf "\n%s\n" "--- starting over with the updated version ---" printf "\n%s\n" "--- starting over with the updated version ---"
@ -100,7 +101,7 @@ self_update() {
fi fi
} }
### Choose from list -function: # Choose from list function
choosecontainers() { choosecontainers() {
while [[ -z "$ChoiceClean" ]]; do while [[ -z "$ChoiceClean" ]]; do
read -r -p "Enter number(s) separated by comma, [a] for all - [q] to quit: " Choice read -r -p "Enter number(s) separated by comma, [a] for all - [q] to quit: " Choice
@ -112,7 +113,7 @@ choosecontainers() {
else else
ChoiceClean=${Choice//[,.:;]/ } ChoiceClean=${Choice//[,.:;]/ }
for CC in $ChoiceClean ; do for CC in $ChoiceClean ; do
if [[ "$CC" -lt 1 || "$CC" -gt $UpdCount ]] ; then # reset choice if out of bounds if [[ "$CC" -lt 1 || "$CC" -gt $UpdCount ]] ; then # Reset choice if out of bounds
echo "Number not in list: $CC" ; unset ChoiceClean ; break 1 echo "Number not in list: $CC" ; unset ChoiceClean ; break 1
else else
SelectedUpdates+=( "${GotUpdates[$CC-1]}" ) SelectedUpdates+=( "${GotUpdates[$CC-1]}" )
@ -139,15 +140,15 @@ progress_bar() {
QueCurrent="$1" QueCurrent="$1"
QueTotal="$2" QueTotal="$2"
((Percent=100*QueCurrent/QueTotal)) ((Percent=100*QueCurrent/QueTotal))
((Complete=50*Percent/100)) # change first number for width (50) ((Complete=50*Percent/100)) # Change first number for width (50)
((Left=50-Complete)) # change first number for width (50) ((Left=50-Complete)) # Change first number for width (50)
BarComplete=$(printf "%${Complete}s" | tr " " "#") BarComplete=$(printf "%${Complete}s" | tr " " "#")
BarLeft=$(printf "%${Left}s" | tr " " "-") BarLeft=$(printf "%${Left}s" | tr " " "-")
[[ "$QueTotal" == "$QueCurrent" ]] || printf "\r[%s%s] %s/%s " "$BarComplete" "$BarLeft" "$QueCurrent" "$QueTotal" [[ "$QueTotal" == "$QueCurrent" ]] || printf "\r[%s%s] %s/%s " "$BarComplete" "$BarLeft" "$QueCurrent" "$QueTotal"
[[ "$QueTotal" == "$QueCurrent" ]] && printf "\r[%b%s%b] %s/%s \n" "$c_teal" "$BarComplete" "$c_reset" "$QueCurrent" "$QueTotal" [[ "$QueTotal" == "$QueCurrent" ]] && printf "\r[%b%s%b] %s/%s \n" "$c_teal" "$BarComplete" "$c_reset" "$QueCurrent" "$QueTotal"
} }
### Function to add user-provided urls to releasenotes # Function to add user-provided urls to releasenotes
releasenotes() { releasenotes() {
for update in ${GotUpdates[@]}; do for update in ${GotUpdates[@]}; do
found=false found=false
@ -158,7 +159,7 @@ releasenotes() {
done done
} }
### Version check & initiate self update # Version check & initiate self update
if [[ "$VERSION" != "$LatestRelease" ]] ; then if [[ "$VERSION" != "$LatestRelease" ]] ; then
printf "New version available! %b%s%b ⇒ %b%s%b \n Change Notes: %s \n" "$c_yellow" "$VERSION" "$c_reset" "$c_green" "$LatestRelease" "$c_reset" "$LatestChanges" printf "New version available! %b%s%b ⇒ %b%s%b \n Change Notes: %s \n" "$c_yellow" "$VERSION" "$c_reset" "$c_green" "$LatestRelease" "$c_reset" "$LatestChanges"
if [[ -z "$AutoUp" ]] ; then if [[ -z "$AutoUp" ]] ; then
@ -167,26 +168,26 @@ if [[ "$VERSION" != "$LatestRelease" ]] ; then
fi fi
fi fi
### Set $1 to a variable for name filtering later. # Set $1 to a variable for name filtering later
SearchName="$1" SearchName="$1"
### Create array of excludes # Create array of excludes
IFS=',' read -r -a Excludes <<< "$Exclude" ; unset IFS IFS=',' read -r -a Excludes <<< "$Exclude" ; unset IFS
### Check if required binary exists in PATH or directory: # Check if required binary exists in PATH or directory
if [[ $(builtin type -P "regctl") ]]; then regbin="regctl" ; if [[ $(command -v regctl) ]]; then regbin="regctl" ;
elif [[ -f "$ScriptWorkDir/regctl" ]]; then regbin="$ScriptWorkDir/regctl" ; elif [[ -f "$ScriptWorkDir/regctl" ]]; then regbin="$ScriptWorkDir/regctl" ;
else else
read -r -p "Required dependency 'regctl' missing, do you want it downloaded? y/[n] " GetDep read -r -p "Required dependency 'regctl' missing, do you want it downloaded? y/[n] " GetDep
if [[ "$GetDep" =~ [yY] ]] ; then if [[ "$GetDep" =~ [yY] ]] ; then
### Check arch: # Check architecture
case "$(uname --machine)" in case "$(uname --machine)" in
x86_64|amd64) architecture="amd64" ;; x86_64|amd64) architecture="amd64" ;;
arm64|aarch64) architecture="arm64";; arm64|aarch64) architecture="arm64";;
*) echo "Architecture not supported, exiting." ; exit 1;; *) echo "Architecture not supported, exiting." ; exit 1;;
esac esac
RegUrl="https://github.com/regclient/regclient/releases/latest/download/regctl-linux-$architecture" RegUrl="https://github.com/regclient/regclient/releases/latest/download/regctl-linux-$architecture"
if [[ $(builtin type -P curl) ]]; then curl -L $RegUrl > "$ScriptWorkDir/regctl" ; chmod +x "$ScriptWorkDir/regctl" ; regbin="$ScriptWorkDir/regctl" ; if [[ $(command -v curl) ]]; then curl -L $RegUrl > "$ScriptWorkDir/regctl" ; chmod +x "$ScriptWorkDir/regctl" ; regbin="$ScriptWorkDir/regctl" ;
elif [[ $(builtin type -P wget) ]]; then wget $RegUrl -O "$ScriptWorkDir/regctl" ; chmod +x "$ScriptWorkDir/regctl" ; regbin="$ScriptWorkDir/regctl" ; elif [[ $(command -v wget) ]]; then wget $RegUrl -O "$ScriptWorkDir/regctl" ; chmod +x "$ScriptWorkDir/regctl" ; regbin="$ScriptWorkDir/regctl" ;
else else
printf "%s\n" "curl/wget not available - get regctl manually from the repo link, quitting." printf "%s\n" "curl/wget not available - get regctl manually from the repo link, quitting."
fi fi
@ -195,10 +196,10 @@ else
exit 1 exit 1
fi fi
fi fi
### final check if binary is correct # Final check if binary is correct
$regbin version &> /dev/null || { printf "%s\n" "regctl is not working - try to remove it and re-download it, exiting."; exit 1; } $regbin version &> /dev/null || { printf "%s\n" "regctl is not working - try to remove it and re-download it, exiting."; exit 1; }
### Check docker compose binary: # Check docker compose binary
if docker compose version &> /dev/null ; then DockerBin="docker compose" ; if docker compose version &> /dev/null ; then DockerBin="docker compose" ;
elif docker-compose -v &> /dev/null; then DockerBin="docker-compose" ; elif docker-compose -v &> /dev/null; then DockerBin="docker-compose" ;
elif docker -v &> /dev/null; then elif docker -v &> /dev/null; then
@ -209,7 +210,13 @@ else
exit 1 exit 1
fi fi
### Numbered List -function: # Check for jq binary
if [[ ! $(command -v jq) ]] ; then
printf "%s\n" "No jq binary, please install jq and try again, exiting."
exit 1
fi
# Numbered List function
options() { options() {
num=1 num=1
for i in "${GotUpdates[@]}"; do for i in "${GotUpdates[@]}"; do
@ -218,7 +225,7 @@ for i in "${GotUpdates[@]}"; do
done done
} }
### Listing typed exclusions: # Listing typed exclusions
if [[ -n ${Excludes[*]} ]] ; then if [[ -n ${Excludes[*]} ]] ; then
printf "\n%bExcluding these names:%b\n" "$c_blue" "$c_reset" printf "\n%bExcluding these names:%b\n" "$c_blue" "$c_reset"
printf "%s\n" "${Excludes[@]}" printf "%s\n" "${Excludes[@]}"
@ -226,11 +233,11 @@ if [[ -n ${Excludes[*]} ]] ; then
fi fi
# Variables for progress_bar function # Variables for progress_bar function
DocCount=$(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}' | wc -l) ContCount=$(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}' | wc -l)
RegCheckQue=0 RegCheckQue=0
### Testing and setting timeout binary # Testing and setting timeout binary
t_out=$(type -P "timeout") t_out=$(command -v timeout)
if [[ $t_out ]]; then if [[ $t_out ]]; then
t_out=$(realpath $t_out 2>/dev/null || readlink -f $t_out) t_out=$(realpath $t_out 2>/dev/null || readlink -f $t_out)
if [[ $t_out =~ "busybox" ]]; then if [[ $t_out =~ "busybox" ]]; then
@ -240,15 +247,15 @@ if [[ $t_out ]]; then
else t_out="" else t_out=""
fi fi
### Check the image-hash of every running container VS the registry # Check the image-hash of every running container VS the registry
for i in $(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}') ; do for i in $(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}') ; do
((RegCheckQue+=1)) ((RegCheckQue+=1))
progress_bar "$RegCheckQue" "$DocCount" progress_bar "$RegCheckQue" "$ContCount"
### Looping every item over the list of excluded names and skipping: # Looping every item over the list of excluded names and skipping
for e in "${Excludes[@]}" ; do [[ "$i" == "$e" ]] && continue 2 ; done for e in "${Excludes[@]}" ; do [[ "$i" == "$e" ]] && continue 2 ; done
RepoUrl=$(docker inspect "$i" --format='{{.Config.Image}}') RepoUrl=$(docker inspect "$i" --format='{{.Config.Image}}')
LocalHash=$(docker image inspect "$RepoUrl" --format '{{.RepoDigests}}') LocalHash=$(docker image inspect "$RepoUrl" --format '{{.RepoDigests}}')
# Checking for errors while setting the variable: # Checking for errors while setting the variable
if RegHash=$(${t_out} $regbin -v error image digest --list "$RepoUrl" 2>&1) ; then if RegHash=$(${t_out} $regbin -v error image digest --list "$RepoUrl" 2>&1) ; then
if [[ "$LocalHash" = *"$RegHash"* ]] ; then if [[ "$LocalHash" = *"$RegHash"* ]] ; then
NoUpdates+=("$i") NoUpdates+=("$i")
@ -260,27 +267,27 @@ for i in $(docker ps $Stopped --filter "name=$SearchName" --format '{{.Names}}')
fi fi
fi fi
else else
# Here the RegHash is the result of an error code. # Here the RegHash is the result of an error code
GotErrors+=("$i - ${RegHash}") GotErrors+=("$i - ${RegHash}")
fi fi
done done
### Sort arrays alphabetically # Sort arrays alphabetically
IFS=$'\n' IFS=$'\n'
NoUpdates=($(sort <<<"${NoUpdates[*]}")) NoUpdates=($(sort <<<"${NoUpdates[*]}"))
GotUpdates=($(sort <<<"${GotUpdates[*]}")) GotUpdates=($(sort <<<"${GotUpdates[*]}"))
unset IFS unset IFS
### Define how many updates are available # Define how many updates are available
UpdCount="${#GotUpdates[@]}" UpdCount="${#GotUpdates[@]}"
### List what containers got updates or not # List what containers got updates or not
if [[ -n ${NoUpdates[*]} ]] ; then if [[ -n ${NoUpdates[*]} ]] ; then
printf "\n%bContainers on latest version:%b\n" "$c_green" "$c_reset" printf "\n%bContainers on latest version:%b\n" "$c_green" "$c_reset"
printf "%s\n" "${NoUpdates[@]}" printf "%s\n" "${NoUpdates[@]}"
fi fi
if [[ -n ${GotErrors[*]} ]] ; then if [[ -n ${GotErrors[*]} ]] ; then
printf "\n%bContainers with errors, wont get updated:%b\n" "$c_red" "$c_reset" printf "\n%bContainers with errors, won't get updated:%b\n" "$c_red" "$c_reset"
printf "%s\n" "${GotErrors[@]}" printf "%s\n" "${GotErrors[@]}"
printf "%binfo:%b 'unauthorized' often means not found in a public registry.\n" "$c_blue" "$c_reset" printf "%binfo:%b 'unauthorized' often means not found in a public registry.\n" "$c_blue" "$c_reset"
fi fi
@ -290,11 +297,11 @@ if [[ -n ${GotUpdates[*]} ]] ; then
[[ -n "$Notify" ]] && { [[ $(type -t send_notification) == function ]] && send_notification "${GotUpdates[@]}" || printf "Could not source notification function.\n" ; } [[ -n "$Notify" ]] && { [[ $(type -t send_notification) == function ]] && send_notification "${GotUpdates[@]}" || printf "Could not source notification function.\n" ; }
fi fi
### Optionally get updates if there's any # Optionally get updates if there's any
if [ -n "$GotUpdates" ] ; then if [ -n "$GotUpdates" ] ; then
if [ -z "$AutoUp" ] ; then if [ -z "$AutoUp" ] ; then
printf "\n%bChoose what containers to update.%b\n" "$c_teal" "$c_reset" printf "\n%bChoose what containers to update.%b\n" "$c_teal" "$c_reset"
choosecontainers choosecontainers
else else
SelectedUpdates=( "${GotUpdates[@]}" ) SelectedUpdates=( "${GotUpdates[@]}" )
fi fi
@ -305,14 +312,23 @@ if [ -n "$GotUpdates" ] ; then
do do
((CurrentQue+=1)) ((CurrentQue+=1))
unset CompleteConfs unset CompleteConfs
ContPath=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}') # Extract labels and metadata
ContConfigFile=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.config_files" }}') ContLabels=$(docker inspect "$i" --format '{{json .Config.Labels}}')
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}}') ContImage=$(docker inspect "$i" --format='{{.Config.Image}}')
ContUpdateLabel=$(docker inspect "$i" --format '{{ index .Config.Labels "mag37.dockcheck.update" }}') ContPath=$(jq -r '."com.docker.compose.project.working_dir"' <<< "$ContLabels")
ContRestartStack=$(docker inspect "$i" --format '{{ index .Config.Labels "mag37.dockcheck.restart-stack" }}') [ "$ContPath" == "null" ] && ContPath=""
### Checking if compose-values are empty - hence started with docker run: ContConfigFile=$(jq -r '."com.docker.compose.project.config_files"' <<< "$ContLabels")
[ "$ContConfigFile" == "null" ] && ContConfigFile=""
ContName=$(jq -r '."com.docker.compose.service"' <<< "$ContLabels")
[ "$ContName" == "null" ] && ContName=""
ContEnv=$(jq -r '."com.docker.compose.project.environment_file"' <<< "$ContLabels")
[ "$ContEnv" == "null" ] && ContEnv=""
ContUpdateLabel=$(jq -r '."mag37.dockcheck.update"' <<< "$ContLabels")
[ "$ContUpdateLabel" == "null" ] && ContUpdateLabel=""
ContRestartStack=$(jq -r '."mag37.dockcheck.restart-stack"' <<< "$ContLabels")
[ "$ContRestartStack" == "null" ] && ContRestartStack=""
# Checking if compose-values are empty - hence started with docker run
if [ -z "$ContPath" ] ; then if [ -z "$ContPath" ] ; then
if [ "$DRunUp" == "yes" ] ; then if [ "$DRunUp" == "yes" ] ; then
docker pull "$ContImage" docker pull "$ContImage"
@ -322,7 +338,7 @@ if [ -n "$GotUpdates" ] ; then
fi fi
continue continue
fi fi
### cd to the compose-file directory to account for people who use relative volumes, eg - ${PWD}/data:data # cd to the compose-file directory to account for people who use relative volumes
cd "$ContPath" || { echo "Path error - skipping $i" ; continue ; } cd "$ContPath" || { echo "Path error - skipping $i" ; continue ; }
## Reformatting path + multi compose ## Reformatting path + multi compose
if [[ $ContConfigFile = '/'* ]] ; then if [[ $ContConfigFile = '/'* ]] ; then
@ -331,12 +347,12 @@ if [ -n "$GotUpdates" ] ; then
CompleteConfs=$(for conf in ${ContConfigFile//,/ } ; do printf -- "-f %s/%s " "$ContPath" "$conf"; done) CompleteConfs=$(for conf in ${ContConfigFile//,/ } ; do printf -- "-f %s/%s " "$ContPath" "$conf"; done)
fi fi
printf "\n%bNow updating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset" 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 # Checking if Label Only -option is set, and if container got the label
[[ "$OnlyLabel" == true ]] && { [[ "$ContUpdateLabel" != true ]] && { echo "No update label, skipping." ; continue ; } } [[ "$OnlyLabel" == true ]] && { [[ "$ContUpdateLabel" != true ]] && { echo "No update label, skipping." ; continue ; } }
docker pull "$ContImage" docker pull "$ContImage"
### Check if the container got an environment file set and reformat it # Check if the container got an environment file set and reformat it
if [ -n "$ContEnv" ]; then ContEnvs=$(for env in ${ContEnv//,/ } ; do printf -- "--env-file %s " "$env"; done) ; fi if [ -n "$ContEnv" ]; then ContEnvs=$(for env in ${ContEnv//,/ } ; do printf -- "--env-file %s " "$env"; done) ; fi
### Check if the whole stack should be restarted # Check if the whole stack should be restarted
if [[ "$ContRestartStack" == true ]] || [[ "$ForceRestartStacks" == true ]] ; then if [[ "$ContRestartStack" == true ]] || [[ "$ForceRestartStacks" == true ]] ; then
$DockerBin ${CompleteConfs} stop ; $DockerBin ${CompleteConfs} ${ContEnvs} up -d $DockerBin ${CompleteConfs} stop ; $DockerBin ${CompleteConfs} ${ContEnvs} up -d
else else

View file

@ -2,12 +2,21 @@
SearchName="$1" SearchName="$1"
for i in $(docker ps --filter "name=$SearchName" --format '{{.Names}}') ; do for i in $(docker ps --filter "name=$SearchName" --format '{{.Names}}') ; do
echo "------------ $i ------------" echo "------------ $i ------------"
ContPath=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}') ContLabels=$(docker inspect "$i" --format '{{json .Config.Labels}}')
[ -z "$ContPath" ] && { "$i has no compose labels - skipping" ; continue ; }
ContConfigFile=$(docker inspect "$i" --format '{{ index .Config.Labels "com.docker.compose.project.config_files" }}')
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}}') ContImage=$(docker inspect "$i" --format='{{.Config.Image}}')
ContPath=$(jq -r '."com.docker.compose.project.working_dir"' <<< "$ContLabels")
[ "$ContPath" == "null" ] && ContPath=""
[ -z "$ContPath" ] && { "$i has no compose labels - skipping" ; continue ; }
ContConfigFile=$(jq -r '."com.docker.compose.project.config_files"' <<< "$ContLabels")
[ "$ContConfigFile" == "null" ] && ContConfigFile=""
ContName=$(jq -r '."com.docker.compose.service"' <<< "$ContLabels")
[ "$ContName" == "null" ] && ContName=""
ContEnv=$(jq -r '."com.docker.compose.project.environment_file"' <<< "$ContLabels")
[ "$ContEnv" == "null" ] && ContEnv=""
ContUpdateLabel=$(jq -r '."mag37.dockcheck.update"' <<< "$ContLabels")
[ "$ContUpdateLabel" == "null" ] && ContUpdateLabel=""
ContRestartStack=$(jq -r '."mag37.dockcheck.restart-stack"' <<< "$ContLabels")
[ "$ContRestartStack" == "null" ] && ContRestartStack=""
if [[ $ContConfigFile = '/'* ]] ; then if [[ $ContConfigFile = '/'* ]] ; then
ComposeFile="$ContConfigFile" ComposeFile="$ContConfigFile"
@ -20,6 +29,8 @@ for i in $(docker ps --filter "name=$SearchName" --format '{{.Names}}') ; do
echo -e "Compose files:\t\t$ComposeFile" echo -e "Compose files:\t\t$ComposeFile"
echo -e "Environment files:\t$ContEnv" echo -e "Environment files:\t$ContEnv"
echo -e "Container image:\t$ContImage" echo -e "Container image:\t$ContImage"
echo -e "Update label:\t$ContUpdateLabel"
echo -e "Restart Stack label:\t$ContRestartStack"
echo echo
echo "Mounts:" echo "Mounts:"
docker inspect -f '{{ range .Mounts }}{{ .Source }}:{{ .Destination }}{{ printf "\n" }}{{ end }}' "$i" docker inspect -f '{{ range .Mounts }}{{ .Source }}:{{ .Destination }}{{ printf "\n" }}{{ end }}' "$i"