mirror of
https://github.com/mag37/dockcheck.git
synced 2026-04-19 10:57:45 +00:00
Compare commits
4 Commits
160f4a2c5f
...
7493d462b3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7493d462b3 | ||
|
|
ed2938166f | ||
|
|
49403b98a1 | ||
|
|
f16953a479 |
33
README.md
33
README.md
@@ -22,6 +22,11 @@
|
||||
___
|
||||
## 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.
|
||||
@@ -38,16 +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
|
||||
___
|
||||
|
||||
|
||||
@@ -68,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.
|
||||
@@ -245,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:
|
||||
|
||||
|
||||
@@ -28,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.
|
||||
|
||||
23
dockcheck.sh
23
dockcheck.sh
@@ -43,7 +43,9 @@ 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."
|
||||
@@ -59,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}
|
||||
@@ -103,7 +111,7 @@ c_reset="\033[0m"
|
||||
RunTimestamp=$(date +'%Y-%m-%d_%H%M')
|
||||
RunEpoch=$(date +'%s')
|
||||
|
||||
while getopts "ayfFhiIlmMnprsuvc:e:d:k:t:x:R" options; do
|
||||
while getopts "ayfFhiIlmMnprsuvc:e:d:k:Kt:x:R" options; do
|
||||
case "${options}" in
|
||||
a|y) AutoMode=true ;;
|
||||
c) CollectorTextFileDirectory="${OPTARG}" ;;
|
||||
@@ -114,6 +122,7 @@ while getopts "ayfFhiIlmMnprsuvc:e:d:k:t:x:R" options; do
|
||||
i) Notify=true ;;
|
||||
I) PrintReleaseURL=true ;;
|
||||
k) DaysKept="${OPTARG}" ;;
|
||||
K) print_backups; exit 0 ;;
|
||||
l) OnlyLabel=true ;;
|
||||
m) MonoMode=true ;;
|
||||
M) PrintMarkdownURL=true ;;
|
||||
@@ -615,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
|
||||
|
||||
printf "\n%bNow recreating (%s/%s): %b%s%b\n" "$c_teal" "$CurrentQue" "$NumberofUpdates" "$c_blue" "$i" "$c_reset"
|
||||
# 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
|
||||
|
||||
Reference in New Issue
Block a user