mirror of
https://github.com/mag37/dockcheck.git
synced 2026-04-19 19:07:50 +00:00
Compare commits
26 Commits
v0.7.2
...
7493d462b3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7493d462b3 | ||
|
|
ed2938166f | ||
|
|
49403b98a1 | ||
|
|
f16953a479 | ||
|
|
160f4a2c5f | ||
|
|
85e2b2c02c | ||
|
|
644cbaedd1 | ||
|
|
eeb719296d | ||
|
|
9c44a5176d | ||
|
|
e191971933 | ||
|
|
c3c7206622 | ||
|
|
c1124676d1 | ||
|
|
6576a36fda | ||
|
|
42d35b7a03 | ||
|
|
fc58962f79 | ||
|
|
ff2006437f | ||
|
|
ac98e81172 | ||
|
|
6fefcbc3dd | ||
|
|
c33c9f4387 | ||
|
|
c34d52bde0 | ||
|
|
7ea97d06ce | ||
|
|
8970ee3f20 | ||
|
|
12a51d8e83 | ||
|
|
24cae63b61 | ||
|
|
05e5b23e7b | ||
|
|
be58805824 |
65
README.md
65
README.md
@@ -22,7 +22,19 @@
|
||||
___
|
||||
## Changelog
|
||||
|
||||
|
||||
- **v0.7.5**:
|
||||
- Added new option **DaysKept**; `-k N` and `-K`:
|
||||
- Backup an image before pulling a new version for easy rollback in case of breakage.
|
||||
- Removes backed up images older than *N* days.
|
||||
- List currently backed up images with `-K`.
|
||||
- **v0.7.4**:
|
||||
- Added new option `-R`:
|
||||
- Will skip container recreation after pulling images.
|
||||
- Allows for more control and possible pipeline integration.
|
||||
- Fixes:
|
||||
- Bugfix for *value too great* error due to leading zeroes - solved with base10 conversion.
|
||||
- Clean up of some legacy readme sections.
|
||||
- **v0.7.3**: Bugfix - unquoted variable in printf list caused occasional issues.
|
||||
- **v0.7.2**:
|
||||
- Label rework:
|
||||
- Moved up label logic to work globally on the current run.
|
||||
@@ -31,20 +43,6 @@ ___
|
||||
- List reformatting for "available updates" numbering to easier highlight and copy:
|
||||
- Padded with zero, changed `)` to `-`, example: `02 - homer`
|
||||
- Can be selected by writing `2,3,4` or `02,03,04`.
|
||||
- **v0.7.1**:
|
||||
- Added support for multiple notifications using the same template
|
||||
- Added support for notification output format
|
||||
- Added support for file output
|
||||
- Added optional configuration variables per channel to (replace `<channel>` with any channel name):
|
||||
- `<channel>_TEMPLATE` : Specify a template
|
||||
- `<channel>_SKIPSNOOZE` : Skip snooze
|
||||
- `<channel>_CONTAINERSONLY` : Only notify for docker container related updates
|
||||
- `<channel>_ALLOWEMPTY` : Always send notifications, even when empty
|
||||
- `<channel>_OUTPUT` : Define output format
|
||||
- **v0.7.0**:
|
||||
- Bugfix: snooze dockcheck.sh-self-notification and some config clarification.
|
||||
- Added authentication support to Ntfy.sh.
|
||||
- Added suport for sendmail in the SMTP-template.
|
||||
___
|
||||
|
||||
|
||||
@@ -65,6 +63,8 @@ Options:
|
||||
-F Only compose up the specific container, not the whole compose stack (useful for master-compose structure).
|
||||
-h Print this Help.
|
||||
-i Inform - send a preconfigured notification.
|
||||
-k N DaysKept - enable backups of images prior to update and prunes backups older than N days.
|
||||
-K List currently backed up images, then exit.
|
||||
-I Prints custom releasenote urls alongside each container with updates in CLI output (requires urls.list).
|
||||
-l Only include containers with label set. See readme.
|
||||
-m Monochrome mode, no printf colour codes and hides progress bar.
|
||||
@@ -72,6 +72,7 @@ Options:
|
||||
-n No updates, only checking availability.
|
||||
-p Auto-Prune dangling images after update.
|
||||
-r Allow checking for updates/updating images for docker run containers. Won't update the container.
|
||||
-R Skip container recreation after pulling images.
|
||||
-s Include stopped containers in the check. (Logic: docker ps -a).
|
||||
-t N Set a timeout (in seconds) per container for registry checkups, 10 is default.
|
||||
-u Allow automatic self updates - caution as this will pull new code and autorun it.
|
||||
@@ -101,7 +102,7 @@ After the updates are complete, you'll get prompted if you'd like to prune dangl
|
||||
___
|
||||
|
||||
## Dependencies
|
||||
- Running docker (duh) and compose, either standalone or plugin. (see [Podman fork](https://github.com/sudo-kraken/podcheck)
|
||||
- Running docker (duh) and compose, either standalone or plugin. (see [Podman fork](https://github.com/sudo-kraken/podcheck))
|
||||
- Bash shell or compatible shell of at least v4.3
|
||||
- POSIX `xargs`, usually default but can be installed with the `findutils` package - to enable async.
|
||||
- [jq](https://github.com/jqlang/jq)
|
||||
@@ -241,6 +242,22 @@ The `urls.list` file is just an example and I'd gladly see that people contribut
|
||||
Pass `-x N` where N is number of subprocesses allowed, experiment in your environment to find a suitable max!
|
||||
Change the default value by editing the `MaxAsync=N` variable in `dockcheck.sh`. To disable the subprocess function set `MaxAsync=0`.
|
||||
|
||||
## Image Backups; `-k N` to backup previous images as custom (retagged) images for easy rollback
|
||||
When the option `DaysKept` is set **dockcheck** will store the image being updated as a backup, retagged with a different name and removed due to age configured (*DaysKept*) in a future run.
|
||||
Let's say we're updating `b4bz/homer:latest` - then before replacing the current image it will be retagged with the name `dockcheck/homer:2025-10-26_1132_latest`
|
||||
- `dockcheck` as repo name to not interfere with others.
|
||||
- `homer` is the image.
|
||||
- `2025-10-26_1132` is the time when running the script.
|
||||
- `latest` is the tag of the image.
|
||||
|
||||
Then if an update breaks you could temporarily roll back to the previoius working state by changing the docker compose image to `image: dockcheck/homer:2025-10-26_1132_latest` and get it up and running again, then continue troubleshooting the breaking update.
|
||||
|
||||
The backed up images will be removed if they're older than *DaysKept* value (passed as `-k N` or set in the `dockcheck.config` with `DaysKept=N`) and then pruned.
|
||||
If configured for eg. 7 days, force earlier cleaning by just passing a lower number of days, eg. `-k 2` to clean everything older than 2 days.
|
||||
Backed up images will not be removed if neither `-k` flag nor `DaysKept` config variable is set.
|
||||
|
||||
Use the capital option `-K` to list currently backed up images. Or list all images with `docker images`.
|
||||
To manually remove any backed up images, do `docker rmi dockcheck/homer:2025-10-26_1132_latest`.
|
||||
|
||||
## Extra plugins and tools:
|
||||
|
||||
@@ -344,11 +361,17 @@ dockcheck is created and released under the [GNU GPL v3.0](https://www.gnu.org/l
|
||||
|
||||
## Sponsorlist
|
||||
|
||||
- [avegy](https://github.com/avegy)
|
||||
- [eichhorn](https://github.com/eichhorn)
|
||||
- [stepdg](https://github.com/stepdg)
|
||||
- [acer2220](https://github.com/acer2220)
|
||||
- [shgew](https://github.com/shgew)
|
||||
:small_orange_diamond: [avegy](https://github.com/avegy)
|
||||
:small_orange_diamond: [eichhorn](https://github.com/eichhorn)
|
||||
:small_orange_diamond: [stepdg](https://github.com/stepdg)
|
||||
:small_orange_diamond: [acer2220](https://github.com/acer2220)
|
||||
:small_orange_diamond: [shgew](https://github.com/shgew)
|
||||
:small_orange_diamond: [jonas3456](https://github.com/jonas3456)
|
||||
:small_orange_diamond: [4ndreasH](https://github.com/4ndreasH)
|
||||
:small_orange_diamond: [markoe01](https://github.com/markoe01)
|
||||
:small_orange_diamond: [mushrowan](https://github.com/mushrowan)
|
||||
:small_orange_diamond:
|
||||
|
||||
___
|
||||
|
||||
### The [story](https://mag37.org/posts/project_dockcheck/) behind it. 1 year in retrospect.
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#OnlyLabel=true # Only update if label is set. See readme.
|
||||
#ForceRestartStacks=true # Force stop+start stack after update. Caution: restarts once for every updated container within stack.
|
||||
#DRunUp=true # Allow updating images for docker run, wont update the container.
|
||||
#SkipRecreate # Skip container recreation after pulling images.
|
||||
#MonoMode=true # Monochrome mode, no printf colour codes and hides progress bar.
|
||||
#PrintReleaseURL=true # Prints custom releasenote urls alongside each container with updates (requires urls.list)`
|
||||
#PrintMarkdownURL=true # Prints custom releasenote urls as markdown
|
||||
@@ -27,6 +28,7 @@
|
||||
#CurlRetryCount=3 # Max number of curl retries
|
||||
#CurlConnectTimeout=5 # Time to wait for curl to establish a connection before failing
|
||||
#DisplaySourcedFiles=false # Display what files are being sourced/used
|
||||
#DaysKept=7 # Enable backups of images and removes backups older than N days.
|
||||
|
||||
### Notify settings
|
||||
## All commented values are examples only. Modify as needed.
|
||||
@@ -89,4 +91,3 @@
|
||||
# TELEGRAM_TOPIC_ID="0"
|
||||
#
|
||||
# FILE_PATH="${ScriptWorkDir}/updates_available.txt"
|
||||
|
||||
|
||||
131
dockcheck.sh
131
dockcheck.sh
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
VERSION="v0.7.2"
|
||||
# ChangeNotes: Reformatted updates list, rewrote label logic to work globally when used with `-l`.
|
||||
VERSION="v0.7.4"
|
||||
# ChangeNotes: New option -R to pull without recreation. Fixes: value too great error, legacy cleanups.
|
||||
Github="https://github.com/mag37/dockcheck"
|
||||
RawUrl="https://raw.githubusercontent.com/mag37/dockcheck/main/dockcheck.sh"
|
||||
|
||||
@@ -42,11 +42,15 @@ Help() {
|
||||
echo "-h Print this Help."
|
||||
echo "-i Inform - send a preconfigured notification."
|
||||
echo "-I Prints custom releasenote urls alongside each container with updates in CLI output (requires urls.list)."
|
||||
echo "-k N Number of days to store image backups before pruning - this also enables the backup function."
|
||||
echo "-K List currently backed up images, then exit."
|
||||
echo "-l Only include containers with label set. See readme."
|
||||
echo "-k N DaysKept - enable backups of images prior to update and prunes backups older than N days."
|
||||
echo "-m Monochrome mode, no printf colour codes and hides progress bar."
|
||||
echo "-M Prints custom releasenote urls as markdown (requires template support)."
|
||||
echo "-n No updates; only checking availability without interaction."
|
||||
echo "-p Auto-prune dangling images after update."
|
||||
echo "-R Skip container recreation after pulling images."
|
||||
echo "-r Allow checking for updates/updating images for docker run containers. Won't update the container."
|
||||
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."
|
||||
@@ -57,6 +61,12 @@ Help() {
|
||||
echo "Project source: $Github"
|
||||
}
|
||||
|
||||
# Print current backups function
|
||||
print_backups() {
|
||||
printf "\n%b---%b Currently backed up images %b---%b\n\n" "$c_teal" "$c_blue" "$c_teal" "$c_reset"
|
||||
docker images | sed -ne '/^REPOSITORY/p' -ne '/^dockcheck/p'
|
||||
}
|
||||
|
||||
# Initialise variables
|
||||
Timeout=${Timeout:-10}
|
||||
MaxAsync=${MaxAsync:-1}
|
||||
@@ -76,8 +86,10 @@ Stopped=${Stopped:-""}
|
||||
CollectorTextFileDirectory=${CollectorTextFileDirectory:-}
|
||||
Exclude=${Exclude:-}
|
||||
DaysOld=${DaysOld:-}
|
||||
DaysKept=${DaysKept:-}
|
||||
OnlySpecific=${OnlySpecific:-false}
|
||||
SpecificContainer=${SpecificContainer:-""}
|
||||
SkipRecreate=${SkipRecreate:-false}
|
||||
Excludes=()
|
||||
GotUpdates=()
|
||||
NoUpdates=()
|
||||
@@ -95,7 +107,11 @@ c_blue="\033[0;34m"
|
||||
c_teal="\033[0;36m"
|
||||
c_reset="\033[0m"
|
||||
|
||||
while getopts "ayfFhiIlmMnprsuvc:e:d:t:x:" options; do
|
||||
# Timestamps
|
||||
RunTimestamp=$(date +'%Y-%m-%d_%H%M')
|
||||
RunEpoch=$(date +'%s')
|
||||
|
||||
while getopts "ayfFhiIlmMnprsuvc:e:d:k:Kt:x:R" options; do
|
||||
case "${options}" in
|
||||
a|y) AutoMode=true ;;
|
||||
c) CollectorTextFileDirectory="${OPTARG}" ;;
|
||||
@@ -105,11 +121,14 @@ while getopts "ayfFhiIlmMnprsuvc:e:d:t:x:" options; do
|
||||
F) OnlySpecific=true ;;
|
||||
i) Notify=true ;;
|
||||
I) PrintReleaseURL=true ;;
|
||||
k) DaysKept="${OPTARG}" ;;
|
||||
K) print_backups; exit 0 ;;
|
||||
l) OnlyLabel=true ;;
|
||||
m) MonoMode=true ;;
|
||||
M) PrintMarkdownURL=true ;;
|
||||
n) DontUpdate=true; AutoMode=true;;
|
||||
p) AutoPrune=true ;;
|
||||
R) SkipRecreate=true ;;
|
||||
r) DRunUp=true ;;
|
||||
s) Stopped="-a" ;;
|
||||
t) Timeout="${OPTARG}" ;;
|
||||
@@ -153,6 +172,12 @@ if [[ -n "$DaysOld" ]]; then
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
if [[ -n "$DaysKept" ]]; then
|
||||
if ! [[ $DaysKept =~ ^[0-9]+$ ]]; then
|
||||
printf "-k argument given (%s) is not a number.\n" "$DaysKept"
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
if [[ -n "$CollectorTextFileDirectory" ]]; then
|
||||
if ! [[ -d $CollectorTextFileDirectory ]]; then
|
||||
printf "The directory (%s) does not exist.\n" "$CollectorTextFileDirectory"
|
||||
@@ -193,11 +218,11 @@ self_update() {
|
||||
printf "\n%s\n" "Pulling the latest version."
|
||||
git pull --force || { printf "%bGit error,%b manually pull/clone.\n" "$c_red" "$c_reset"; return; }
|
||||
printf "\n%s\n" "--- starting over with the updated version ---"
|
||||
cd - || { printf "%bPath error.%b\n" "$c_red"; return; }
|
||||
cd - || { printf "%bPath error.%b\n" "$c_red" "$c_reset"; return; }
|
||||
exec "$ScriptPath" "${ScriptArgs[@]}" # run the new script with old arguments
|
||||
exit 0 # exit the old instance
|
||||
else
|
||||
cd - || { printf "%bPath error.%b\n" "$c_red"; return; }
|
||||
cd - || { printf "%bPath error.%b\n" "$c_red" "$c_reset"; return; }
|
||||
self_update_curl
|
||||
fi
|
||||
}
|
||||
@@ -213,6 +238,7 @@ choosecontainers() {
|
||||
else
|
||||
ChoiceClean=${Choice//[,.:;]/ }
|
||||
for CC in $ChoiceClean; do
|
||||
CC=$((10#$CC)) # Base 10 interpretation to strip leading zeroes
|
||||
if [[ "$CC" -lt 1 || "$CC" -gt $UpdCount ]]; then # Reset choice if out of bounds
|
||||
echo "Number not in list: $CC"; unset ChoiceClean; break 1
|
||||
else
|
||||
@@ -224,10 +250,11 @@ choosecontainers() {
|
||||
}
|
||||
|
||||
datecheck() {
|
||||
ImageDate=$("$regbin" -v error image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1)
|
||||
ImageDate="$1"
|
||||
DaysMax="$2"
|
||||
ImageEpoch=$(date -d "$ImageDate" +%s 2>/dev/null) || ImageEpoch=$(date -f "%Y-%m-%d" -j "$ImageDate" +%s)
|
||||
ImageAge=$(( ( $(date +%s) - ImageEpoch )/86400 ))
|
||||
if [[ "$ImageAge" -gt "$DaysOld" ]]; then
|
||||
ImageAge=$(( ( RunEpoch - ImageEpoch )/86400 ))
|
||||
if [[ "$ImageAge" -gt "$DaysMax" ]]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
@@ -348,13 +375,13 @@ list_options() {
|
||||
[[ ${#total} < 2 ]] && local pads=2 || local pads="${#total}"
|
||||
local num=1
|
||||
for update in "${Updates[@]}"; do
|
||||
printf "%0*d - %s\n" $pads $num $update
|
||||
printf "%0*d - %s\n" "$pads" "$num" "$update"
|
||||
((num++))
|
||||
done
|
||||
}
|
||||
|
||||
# Version check & initiate self update
|
||||
if [[ "$LatestRelease" != "undefined" ]]; then
|
||||
if [[ "$LatestSnippet" != "undefined" ]]; 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"
|
||||
if [[ "$AutoMode" == false ]]; then
|
||||
@@ -439,7 +466,7 @@ check_image() {
|
||||
if [[ "$LocalHash" == *"$RegHash"* ]]; then
|
||||
printf "%s\n" "NoUpdates $i"
|
||||
else
|
||||
if [[ -n "${DaysOld:-}" ]] && ! datecheck; then
|
||||
if [[ -n "${DaysOld:-}" ]] && ! datecheck $("$regbin" -v error image inspect "$RepoUrl" --format='{{.Created}}' | cut -d" " -f1) "$DaysOld" ; then
|
||||
printf "%s\n" "NoUpdates +$i ${ImageAge}d"
|
||||
else
|
||||
printf "%s\n" "GotUpdates $i"
|
||||
@@ -453,7 +480,7 @@ check_image() {
|
||||
# Make required functions and variables available to subprocesses
|
||||
export -f check_image datecheck
|
||||
export Excludes_string="${Excludes[*]:-}" # Can only export scalar variables
|
||||
export t_out regbin RepoUrl DaysOld DRunUp jqbin OnlyLabel
|
||||
export t_out regbin RepoUrl DaysOld DRunUp jqbin OnlyLabel RunTimestamp RunEpoch
|
||||
|
||||
# Check for POSIX xargs with -P option, fallback without async
|
||||
if (echo "test" | xargs -P 2 >/dev/null 2>&1) && [[ "$MaxAsync" != 0 ]]; then
|
||||
@@ -536,11 +563,23 @@ if [[ -n "${GotUpdates:-}" ]]; then
|
||||
for i in "${SelectedUpdates[@]}"; do
|
||||
((CurrentQue+=1))
|
||||
printf "\n%bNow updating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset"
|
||||
ContLabels=$(docker inspect "$i" --format '{{json .Config.Labels}}')
|
||||
ContImage=$(docker inspect "$i" --format='{{.Config.Image}}')
|
||||
ContPath=$($jqbin -r '."com.docker.compose.project.working_dir"' <<< "$ContLabels")
|
||||
ContConfig=$(docker inspect "$i" --format '{{json .}}')
|
||||
ContImage=$($jqbin -r '."Config"."Image"' <<< "$ContConfig")
|
||||
ImageId=$($jqbin -r '."Image"' <<< "$ContConfig")
|
||||
ContPath=$($jqbin -r '."Config"."Labels"."com.docker.compose.project.working_dir"' <<< "$ContConfig")
|
||||
[[ "$ContPath" == "null" ]] && ContPath=""
|
||||
|
||||
# Add new backup tag prior to pulling if option is set
|
||||
if [[ -n "${DaysKept:-}" ]]; then
|
||||
ContRepoDigests=$(docker image inspect "$ImageId" --format "{{index .RepoDigests 0}}")
|
||||
ContRepo=${ContImage%:*}
|
||||
ContApp=${ContRepo#*/}
|
||||
[[ "$ContImage" =~ ":" ]] && ContTag=${ContImage#*:} || ContTag="latest"
|
||||
BackupName="dockcheck/${ContApp}:${RunTimestamp}_${ContTag}"
|
||||
docker tag "$ImageId" "$BackupName"
|
||||
printf "%b%s backed up as %s%b\n" "$c_teal" "$i" "$BackupName" "$c_reset"
|
||||
fi
|
||||
|
||||
# Checking if compose-values are empty - hence started with docker run
|
||||
if [[ -z "$ContPath" ]]; then
|
||||
if [[ "$DRunUp" == true ]]; then
|
||||
@@ -552,17 +591,27 @@ if [[ -n "${GotUpdates:-}" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
docker pull "$ContImage" || { printf "\n%bDocker error, exiting!%b\n" "$c_red" "$c_reset" ; exit 1; }
|
||||
done
|
||||
printf "\n%bDone pulling updates. %bRecreating updated containers.%b\n" "$c_green" "$c_blue" "$c_reset"
|
||||
if docker pull "$ContImage"; then
|
||||
# Removal of the <none>-tag image left behind from backup
|
||||
[[ -n "${DaysKept:-}" ]] && docker rmi "$ContRepoDigests"
|
||||
else
|
||||
printf "\n%bDocker error, exiting!%b\n" "$c_red" "$c_reset" ; exit 1
|
||||
fi
|
||||
|
||||
done
|
||||
printf "\n%bDone pulling updates.%b\n" "$c_green" "$c_reset"
|
||||
|
||||
if [[ "$SkipRecreate" == true ]]; then
|
||||
printf "%bSkipping container recreation due to -R.%b\n" "$c_yellow" "$c_reset"
|
||||
else
|
||||
printf "%bRecreating updated containers.%b\n" "$c_blue" "$c_reset"
|
||||
CurrentQue=0
|
||||
for i in "${SelectedUpdates[@]}"; do
|
||||
((CurrentQue+=1))
|
||||
unset CompleteConfs
|
||||
# Extract labels and metadata
|
||||
ContLabels=$(docker inspect "$i" --format '{{json .Config.Labels}}')
|
||||
ContImage=$(docker inspect "$i" --format='{{.Config.Image}}')
|
||||
ContConfig=$(docker inspect "$i" --format '{{json .}}')
|
||||
ContLabels=$($jqbin -r '."Config"."Labels"' <<< "$ContConfig")
|
||||
ContPath=$($jqbin -r '."com.docker.compose.project.working_dir"' <<< "$ContLabels")
|
||||
[[ "$ContPath" == "null" ]] && ContPath=""
|
||||
ContConfigFile=$($jqbin -r '."com.docker.compose.project.config_files"' <<< "$ContLabels")
|
||||
@@ -575,14 +624,22 @@ if [[ -n "${GotUpdates:-}" ]]; then
|
||||
[[ "$ContRestartStack" == "null" ]] && ContRestartStack=""
|
||||
ContOnlySpecific=$($jqbin -r '."mag37.dockcheck.only-specific-container"' <<< "$ContLabels")
|
||||
[[ "$ContOnlySpecific" == "null" ]] && ContRestartStack=""
|
||||
ContStateRunning=$($jqbin -r '."State"."Running"' <<< "$ContConfig")
|
||||
[[ "$ContStateRunning" == "null" ]] && ContStateRunning=""
|
||||
|
||||
if [[ "$ContStateRunning" == "true" ]]; then
|
||||
printf "\n%bNow recreating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset"
|
||||
else
|
||||
printf "\n%bSkipping recreation of %b%s%b as it's not running.%b\n" "$c_yellow" "$c_blue" "$i" "$c_yellow" "$c_reset"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Checking if compose-values are empty - hence started with docker run
|
||||
[[ -z "$ContPath" ]] && { echo "Not a compose container, skipping."; continue; }
|
||||
|
||||
# cd to the compose-file directory to account for people who use relative volumes
|
||||
cd "$ContPath" || { printf "\n%bPath error - skipping%b %s" "$c_red" "$c_reset" "$i"; continue; }
|
||||
## Reformatting path + multi compose
|
||||
# Reformatting path + multi compose
|
||||
if [[ $ContConfigFile == '/'* ]]; then
|
||||
CompleteConfs=$(for conf in ${ContConfigFile//,/ }; do printf -- "-f %s " "$conf"; done)
|
||||
else
|
||||
@@ -601,14 +658,40 @@ if [[ -n "${GotUpdates:-}" ]]; then
|
||||
${DockerBin} ${CompleteConfs} ${ContEnvs} up -d ${SpecificContainer} || { printf "\n%bDocker error, exiting!%b\n" "$c_red" "$c_reset" ; exit 1; }
|
||||
fi
|
||||
done
|
||||
fi
|
||||
printf "\n%bAll updates done!%b\n" "$c_green" "$c_reset"
|
||||
|
||||
# Clean up old backup image tags if -k is used
|
||||
if [[ -n "${DaysKept:-}" ]]; then
|
||||
IFS=$'\n'
|
||||
CleanupCount=0
|
||||
for backup_img in $(docker images --format "{{.Repository}} {{.Tag}}" | sed -n '/^dockcheck/p'); do
|
||||
repo_name=${backup_img% *}
|
||||
backup_tag=${backup_img#* }
|
||||
backup_date=${backup_tag%%_*}
|
||||
# UNTAGGING HERE
|
||||
if datecheck "$backup_date" "$DaysKept"; then
|
||||
[[ "$CleanupCount" == 0 ]] && echo "Removing backed up images older then $DaysKept days."
|
||||
docker rmi "${repo_name}:${backup_tag}" && ((CleanupCount+=1))
|
||||
fi
|
||||
done
|
||||
unset IFS
|
||||
if [[ "$CleanupCount" == 0 ]]; then
|
||||
printf "\nNo backup images to remove.\n"
|
||||
else
|
||||
printf "\n%b%s%b backup images removed.%b\n" "$c_green" "$CleanupCount" "$c_teal" "$c_reset"
|
||||
docker image prune -f
|
||||
fi
|
||||
else
|
||||
if [[ "$AutoPrune" == false ]] && [[ "$AutoMode" == false ]]; then printf "\n"; read -rep "Would you like to prune all dangling images? y/[n]: " AutoPrune; fi
|
||||
if [[ "$AutoPrune" == true ]] || [[ "$AutoPrune" =~ [yY] ]]; then printf "\nAuto pruning.."; docker image prune -f; fi
|
||||
printf "\n%bAll done!%b\n" "$c_green" "$c_reset"
|
||||
fi
|
||||
|
||||
else
|
||||
printf "\nNo updates installed, exiting.\n"
|
||||
printf "\nNo updates installed.\n"
|
||||
fi
|
||||
else
|
||||
printf "\nNo updates available, exiting.\n"
|
||||
printf "\nNo updates available.\n"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -38,35 +38,15 @@ You can also use the [caronc/apprise-api](https://github.com/caronc/apprise-api)
|
||||
|
||||
|
||||
### Customize the **notify.sh** file.
|
||||
After you're done with the setup of the container and tried your notifications, you can copy the `notify_apprise.sh` file to `notify.sh` and start editing it.
|
||||
After you're done with the setup of the container and tried your notifications, you need to follow the configuration setup (explained in detail in the README).
|
||||
Briefly: Copy `default.config` to `dockcheck.config` then edit it to change the following, `APPRISE_URL` matching your environment:
|
||||
|
||||
Comment out/remove the bare metal apprise-command (starting with `apprise -vv -t...`).
|
||||
Uncomment and edit the `AppriseURL` variable and *curl* line
|
||||
It should look something like this when curling the API:
|
||||
```bash
|
||||
send_notification() {
|
||||
Updates=("$@")
|
||||
UpdToString=$( printf "%s\n" "${Updates[@]}" )
|
||||
FromHost=$(hostname)
|
||||
|
||||
printf "\nSending Apprise notification\n"
|
||||
|
||||
MessageTitle="$FromHost - updates available."
|
||||
# Setting the MessageBody variable here.
|
||||
read -d '\n' MessageBody << __EOF
|
||||
Containers on $FromHost with updates available:
|
||||
|
||||
$UpdToString
|
||||
|
||||
__EOF
|
||||
|
||||
AppriseURL="http://IP.or.mydomain.tld:8000/notify/apprise"
|
||||
curl -X POST -F "title=$MessageTitle" -F "body=$MessageBody" -F "tags=all" $AppriseURL
|
||||
|
||||
}
|
||||
NOTIFY_CHANNELS="apprise"
|
||||
APPRISE_URL="http://apprise.mydomain.tld:1234/notify/apprise"
|
||||
```
|
||||
|
||||
That's all!
|
||||
That's it!
|
||||
___
|
||||
___
|
||||
|
||||
|
||||
Reference in New Issue
Block a user