CMK_IMAGE gegen CMK_EDITION/CMK_VERSION pruefen
Anlass war die Frage, wozu CMK_IMAGE neben Edition und Version ueberhaupt noch noetig ist. Antwort: es ist der einzige Wert, den compose und die systemd-Units lesen. Edition und Version sind reine Vorgaben fuer den Downloader und wirken erst ueber "image pull". Ableiten laesst sich CMK_IMAGE nicht, weil dieselbe Version je nach Bezugsweg voellig anders heisst - docker.io/..., registry.checkmk.com/... oder localhost/... bei einem aus dem Tarball geladenen Image. Daraus folgt eine Falle, die bisher nirgends auffiel: wer Edition auf "enterprise" stellt, CMK_IMAGE aber auf dem Raw-Image stehen laesst, betreibt weiter Raw. Genau dieser Zustand kam in der Praxis vor. image_consistency_check vergleicht deshalb Name und Tag von CMK_IMAGE mit Edition und Version und meldet Abweichungen - in "image status", im allgemeinen "status" und im Einstellungsmenue direkt nach dem Aendern von Edition oder Version, dort gleich mit dem Angebot, das Image zu holen. Aus Tarballs geladene Images (localhost/...) gelten als stimmig, solange Name und Tag passen; die Editionsaliase werden beruecksichtigt, "pro" passt also zu check-mk-enterprise. Die Beschriftungen in den Einstellungen sagen jetzt, wer was tut: CMK_IMAGE VERWENDETES Image - setzt "image pull" CMK_EDITION Edition (nur Vorgabe, wirkt ueber "image pull") CMK_VERSION Version (nur Vorgabe, wirkt ueber "image pull") Vier Faelle geprueft: abweichende Edition, abweichende Version, stimmiger Zustand und aus Tarball geladenes Image. Dokumentiert als Abschnitt 8.7 in beiden Sprachfassungen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -876,7 +876,54 @@ ihn als `CMK_IMAGE` in die `.env` ein. Danach:
|
|||||||
sudo ./scripts/cmk-manage.sh up
|
sudo ./scripts/cmk-manage.sh up
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8.7 Nachsehen, was gilt
|
### 8.7 `CMK_IMAGE` gegenüber `CMK_EDITION`/`CMK_VERSION`
|
||||||
|
|
||||||
|
Diese drei Werte haben unterschiedliche Aufgaben, und das ist eine häufige
|
||||||
|
Verwechslung:
|
||||||
|
|
||||||
|
| Wert | Wer liest ihn | Wozu |
|
||||||
|
|---|---|---|
|
||||||
|
| **`CMK_IMAGE`** | **compose und die systemd-Units** | das Image, das tatsächlich gestartet wird |
|
||||||
|
| `CMK_EDITION` | nur `cmk-manage.sh image …` | Vorgabe für den Downloader |
|
||||||
|
| `CMK_VERSION` | nur `cmk-manage.sh image …` | Vorgabe für den Downloader |
|
||||||
|
|
||||||
|
`CMK_IMAGE` lässt sich **nicht** aus Edition und Version ableiten – je nach
|
||||||
|
Bezugsweg sieht dieselbe Version völlig anders aus:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker.io/checkmk/check-mk-raw:2.3.0-latest (Docker Hub)
|
||||||
|
registry.checkmk.com/enterprise/check-mk-enterprise:2.3.0p9 (Registry)
|
||||||
|
localhost/checkmk/check-mk-enterprise:2.3.0p9 (aus Tarball geladen)
|
||||||
|
```
|
||||||
|
|
||||||
|
Deshalb hält `CMK_IMAGE` fest, was **wirklich vorhanden ist**, und wird von
|
||||||
|
`image pull`, `image download`, `image load` und `image use` gesetzt – von Hand
|
||||||
|
muss man dort normalerweise nichts eintragen.
|
||||||
|
|
||||||
|
> **Daraus folgt:** Edition oder Version zu ändern, startet **keine** andere
|
||||||
|
> Ausgabe. Erst `image pull` (bzw. `download`/`load`) schreibt das Ergebnis
|
||||||
|
> nach `CMK_IMAGE`, und erst `up` erstellt den Container neu.
|
||||||
|
|
||||||
|
Damit das nicht unbemerkt auseinanderläuft, prüft das Skript die drei Werte
|
||||||
|
gegeneinander – in `image status`, in `status` und im Einstellungsmenü direkt
|
||||||
|
nach dem Ändern von Edition oder Version:
|
||||||
|
|
||||||
|
```
|
||||||
|
[ WARN ] CMK_IMAGE passt nicht zu den eingestellten Vorgaben.
|
||||||
|
|
||||||
|
verwendet wird : docker.io/checkmk/check-mk-raw:2.3.0-latest
|
||||||
|
Edition : eingestellt "enterprise", im Image steckt "raw"
|
||||||
|
|
||||||
|
Compose und die systemd-Units verwenden ausschliesslich CMK_IMAGE.
|
||||||
|
...
|
||||||
|
./scripts/cmk-manage.sh image pull --edition enterprise --version 2.3.0-latest
|
||||||
|
./scripts/cmk-manage.sh up
|
||||||
|
```
|
||||||
|
|
||||||
|
Aus einem Tarball geladene Images (`localhost/…`) gelten dabei als stimmig,
|
||||||
|
solange Name und Tag passen.
|
||||||
|
|
||||||
|
### 8.8 Nachsehen, was gilt
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./scripts/cmk-manage.sh image status # konfiguriertes + lokale Images
|
./scripts/cmk-manage.sh image status # konfiguriertes + lokale Images
|
||||||
|
|||||||
+47
-1
@@ -882,7 +882,53 @@ typically `localhost/checkmk/check-mk-enterprise:2.3.0p23`) and writes it to
|
|||||||
sudo ./scripts/cmk-manage.sh up
|
sudo ./scripts/cmk-manage.sh up
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8.7 Checking what is in effect
|
### 8.7 `CMK_IMAGE` versus `CMK_EDITION`/`CMK_VERSION`
|
||||||
|
|
||||||
|
These three values have different jobs, and confusing them is a common
|
||||||
|
mistake:
|
||||||
|
|
||||||
|
| Value | Who reads it | What for |
|
||||||
|
|---|---|---|
|
||||||
|
| **`CMK_IMAGE`** | **compose and the systemd units** | the image that actually starts |
|
||||||
|
| `CMK_EDITION` | only `cmk-manage.sh image …` | input for the downloader |
|
||||||
|
| `CMK_VERSION` | only `cmk-manage.sh image …` | input for the downloader |
|
||||||
|
|
||||||
|
`CMK_IMAGE` can **not** be derived from edition and version – depending on how
|
||||||
|
you obtained it, the very same version looks completely different:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker.io/checkmk/check-mk-raw:2.3.0-latest (Docker Hub)
|
||||||
|
registry.checkmk.com/enterprise/check-mk-enterprise:2.3.0p9 (registry)
|
||||||
|
localhost/checkmk/check-mk-enterprise:2.3.0p9 (loaded from a tarball)
|
||||||
|
```
|
||||||
|
|
||||||
|
So `CMK_IMAGE` records what is **actually there**, and it is written by
|
||||||
|
`image pull`, `image download`, `image load` and `image use` – you normally
|
||||||
|
never have to type anything there by hand.
|
||||||
|
|
||||||
|
> **Consequence:** changing the edition or version does **not** start a
|
||||||
|
> different release. Only `image pull` (or `download`/`load`) writes the result
|
||||||
|
> to `CMK_IMAGE`, and only `up` recreates the container.
|
||||||
|
|
||||||
|
To stop these from drifting apart unnoticed, the script compares the three
|
||||||
|
values – in `image status`, in `status`, and in the settings menu right after
|
||||||
|
the edition or version is changed:
|
||||||
|
|
||||||
|
```
|
||||||
|
[ WARN ] CMK_IMAGE passt nicht zu den eingestellten Vorgaben.
|
||||||
|
|
||||||
|
verwendet wird : docker.io/checkmk/check-mk-raw:2.3.0-latest
|
||||||
|
Edition : eingestellt "enterprise", im Image steckt "raw"
|
||||||
|
...
|
||||||
|
./scripts/cmk-manage.sh image pull --edition enterprise --version 2.3.0-latest
|
||||||
|
./scripts/cmk-manage.sh up
|
||||||
|
```
|
||||||
|
|
||||||
|
("CMK_IMAGE does not match the configured defaults / in use / configured … but
|
||||||
|
the image contains …".) Images loaded from a tarball (`localhost/…`) count as
|
||||||
|
consistent as long as name and tag match.
|
||||||
|
|
||||||
|
### 8.8 Checking what is in effect
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./scripts/cmk-manage.sh image status # configured image + local images
|
./scripts/cmk-manage.sh image status # configured image + local images
|
||||||
|
|||||||
+69
-3
@@ -745,7 +745,51 @@ image_cmd_list() {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Passt CMK_IMAGE zu CMK_EDITION/CMK_VERSION?
|
||||||
|
#
|
||||||
|
# CMK_IMAGE ist der einzige Wert, den compose und die systemd-Units
|
||||||
|
# verwenden. CMK_EDITION und CMK_VERSION sind nur Eingaben fuer den
|
||||||
|
# Downloader. Wer sie aendert, ohne anschliessend ein Image zu holen,
|
||||||
|
# betreibt weiter das alte - das faellt sonst nirgends auf.
|
||||||
|
#
|
||||||
|
# Rueckgabe: 0 = stimmig (oder nicht beurteilbar), 1 = Abweichung.
|
||||||
|
# Die Erklaerung geht nach stdout.
|
||||||
|
image_consistency_check() {
|
||||||
|
local img="${CMK_IMAGE:-}" ed="${CMK_EDITION:-}" ver="${CMK_VERSION:-}"
|
||||||
|
[ -n "$img" ] && [ -n "$ed" ] || return 0
|
||||||
|
|
||||||
|
local repo tag name
|
||||||
|
tag="${img##*:}"
|
||||||
|
repo="${img%:*}"
|
||||||
|
case "$repo" in */*) name="${repo##*/}" ;; *) name="$repo" ;; esac
|
||||||
|
# kein Tag angegeben -> nicht beurteilbar
|
||||||
|
[ "$tag" = "$img" ] && tag=""
|
||||||
|
|
||||||
|
local ed_ok="" a
|
||||||
|
for a in $(edition_aliases "$ed"); do
|
||||||
|
[ "$name" = "check-mk-$a" ] && ed_ok=1
|
||||||
|
done
|
||||||
|
|
||||||
|
local ver_ok=1
|
||||||
|
[ -n "$ver" ] && [ -n "$tag" ] && [ "$tag" != "$ver" ] && ver_ok=""
|
||||||
|
|
||||||
|
[ -n "$ed_ok" ] && [ -n "$ver_ok" ] && return 0
|
||||||
|
|
||||||
|
printf 'CMK_IMAGE passt nicht zu den eingestellten Vorgaben.\n\n'
|
||||||
|
printf ' verwendet wird : %s\n' "$img"
|
||||||
|
[ -z "$ed_ok" ] && printf ' Edition : eingestellt "%s", im Image steckt "%s"\n' \
|
||||||
|
"$ed" "${name#check-mk-}"
|
||||||
|
[ -z "$ver_ok" ] && printf ' Version : eingestellt "%s", im Image steckt "%s"\n' "$ver" "$tag"
|
||||||
|
printf '\nCompose und die systemd-Units verwenden ausschliesslich CMK_IMAGE.\n'
|
||||||
|
printf 'Edition und Version sind nur Vorgaben fuer den Downloader - sie\n'
|
||||||
|
printf 'wirken erst, wenn daraus ein Image geholt wird:\n\n'
|
||||||
|
printf ' %s image pull --edition %s --version %s\n' "$SELF" "$ed" "${ver:-<version>}"
|
||||||
|
printf ' %s up\n' "$SELF"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
image_cmd_status() {
|
image_cmd_status() {
|
||||||
|
local msg
|
||||||
printf '\n%sKonfiguriertes Image (.env: CMK_IMAGE)%s\n' "$C_BLD" "$C_RST"
|
printf '\n%sKonfiguriertes Image (.env: CMK_IMAGE)%s\n' "$C_BLD" "$C_RST"
|
||||||
printf ' %s\n' "${CMK_IMAGE:-<nicht gesetzt>}"
|
printf ' %s\n' "${CMK_IMAGE:-<nicht gesetzt>}"
|
||||||
if [ -n "${CMK_IMAGE:-}" ]; then
|
if [ -n "${CMK_IMAGE:-}" ]; then
|
||||||
@@ -758,6 +802,11 @@ image_cmd_status() {
|
|||||||
printf ' %sACHTUNG%s: kurzer Name ohne Registry - unter Podman fehleranfaellig.\n' "$C_RED" "$C_RST"
|
printf ' %sACHTUNG%s: kurzer Name ohne Registry - unter Podman fehleranfaellig.\n' "$C_RED" "$C_RST"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
if ! msg="$(image_consistency_check)"; then
|
||||||
|
printf '\n'
|
||||||
|
warn "$msg"
|
||||||
|
fi
|
||||||
|
|
||||||
printf '\n%sVorgaben fuer den Downloader%s\n' "$C_BLD" "$C_RST"
|
printf '\n%sVorgaben fuer den Downloader%s\n' "$C_BLD" "$C_RST"
|
||||||
printf ' Edition : %s -> %s\n' "${CMK_EDITION:-raw}" "$(edition_repo "${CMK_EDITION:-raw}" 2>/dev/null || echo '?')"
|
printf ' Edition : %s -> %s\n' "${CMK_EDITION:-raw}" "$(edition_repo "${CMK_EDITION:-raw}" 2>/dev/null || echo '?')"
|
||||||
printf ' Version : %s\n' "${CMK_VERSION:-<nicht gesetzt>}"
|
printf ' Version : %s\n' "${CMK_VERSION:-<nicht gesetzt>}"
|
||||||
@@ -1314,10 +1363,16 @@ cmd_shell() { require_cmk_running; $RUNTIME exec -it "$CMK_CONTAINER_NAME" bas
|
|||||||
cmd_omd() { require_cmk_running; $RUNTIME exec -it "$CMK_CONTAINER_NAME" omd "$@"; }
|
cmd_omd() { require_cmk_running; $RUNTIME exec -it "$CMK_CONTAINER_NAME" omd "$@"; }
|
||||||
|
|
||||||
cmd_status() {
|
cmd_status() {
|
||||||
|
local cmsg
|
||||||
printf '\n%sImage%s\n' "$C_BLD" "$C_RST"
|
printf '\n%sImage%s\n' "$C_BLD" "$C_RST"
|
||||||
printf ' %-24s %s\n' "${CMK_IMAGE:-<nicht gesetzt>}" \
|
printf ' %-24s %s\n' "${CMK_IMAGE:-<nicht gesetzt>}" \
|
||||||
"$(image_exists_local "${CMK_IMAGE:-}" && echo "lokal vorhanden" || echo "${C_YEL}nicht lokal vorhanden${C_RST}")"
|
"$(image_exists_local "${CMK_IMAGE:-}" && echo "lokal vorhanden" || echo "${C_YEL}nicht lokal vorhanden${C_RST}")"
|
||||||
|
|
||||||
|
if ! cmsg="$(image_consistency_check)"; then
|
||||||
|
printf ' %sAchtung%s: CMK_IMAGE passt nicht zu CMK_EDITION/CMK_VERSION.\n' "$C_YEL" "$C_RST"
|
||||||
|
printf ' Einzelheiten: %s image status\n' "$SELF"
|
||||||
|
fi
|
||||||
|
|
||||||
printf '\n%sContainer%s\n' "$C_BLD" "$C_RST"
|
printf '\n%sContainer%s\n' "$C_BLD" "$C_RST"
|
||||||
local c
|
local c
|
||||||
for c in "$CMK_CONTAINER_NAME" "$NPM_CONTAINER_NAME"; do
|
for c in "$CMK_CONTAINER_NAME" "$NPM_CONTAINER_NAME"; do
|
||||||
@@ -2404,9 +2459,9 @@ settings_defs() {
|
|||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
runtime|CMK_RUNTIME|choice|Container-Runtime|auto:docker:podman|1
|
runtime|CMK_RUNTIME|choice|Container-Runtime|auto:docker:podman|1
|
||||||
runtime|TZ|text|Zeitzone||
|
runtime|TZ|text|Zeitzone||
|
||||||
image|CMK_IMAGE|text|Checkmk-Image (vollqualifiziert)||
|
image|CMK_IMAGE|text|VERWENDETES Image - setzt "image pull"||
|
||||||
image|CMK_EDITION|choice|Edition fuer den Downloader|raw:community:free:cloud:managed:pro:ultimate:ultimatemt:enterprise|
|
image|CMK_EDITION|choice|Edition (nur Vorgabe, wirkt ueber "image pull")|raw:community:free:cloud:managed:pro:ultimate:ultimatemt:enterprise|
|
||||||
image|CMK_VERSION|text|Version fuer den Downloader||
|
image|CMK_VERSION|text|Version (nur Vorgabe, wirkt ueber "image pull")||
|
||||||
image|CMK_REGISTRY|text|Registry fuer Enterprise||1
|
image|CMK_REGISTRY|text|Registry fuer Enterprise||1
|
||||||
image|CMK_REGISTRY_USER|text|Registry-Benutzer||1
|
image|CMK_REGISTRY_USER|text|Registry-Benutzer||1
|
||||||
image|CMK_REGISTRY_PASSWORD|password|Registry-Kennwort||1
|
image|CMK_REGISTRY_PASSWORD|password|Registry-Kennwort||1
|
||||||
@@ -3539,6 +3594,17 @@ gui_settings_edit() {
|
|||||||
ui_msg "Gespeichert" "$key = $([ "$typ" = password ] && echo '********' || echo "${new:-<leer>}")$hint"
|
ui_msg "Gespeichert" "$key = $([ "$typ" = password ] && echo '********' || echo "${new:-<leer>}")$hint"
|
||||||
# Zugangsdaten lassen sich sofort pruefen - das erspart den Umweg
|
# Zugangsdaten lassen sich sofort pruefen - das erspart den Umweg
|
||||||
case "$key" in
|
case "$key" in
|
||||||
|
CMK_EDITION|CMK_VERSION)
|
||||||
|
load_env "${ENV_FILE:-$PROJECT_DIR/.env}"
|
||||||
|
local cm
|
||||||
|
if ! cm="$(image_consistency_check)"; then
|
||||||
|
if ui_yesno "Image passt nicht" \
|
||||||
|
"$cm
|
||||||
|
|
||||||
|
Image jetzt holen?"; then
|
||||||
|
gui_image_pull || true
|
||||||
|
fi
|
||||||
|
fi ;;
|
||||||
CMK_REGISTRY_USER|CMK_REGISTRY_PASSWORD|CMK_DOWNLOAD_USER|CMK_DOWNLOAD_PASSWORD|CMK_REGISTRY|CMK_DOWNLOAD_BASEURL)
|
CMK_REGISTRY_USER|CMK_REGISTRY_PASSWORD|CMK_DOWNLOAD_USER|CMK_DOWNLOAD_PASSWORD|CMK_REGISTRY|CMK_DOWNLOAD_BASEURL)
|
||||||
load_env "${ENV_FILE:-$PROJECT_DIR/.env}"
|
load_env "${ENV_FILE:-$PROJECT_DIR/.env}"
|
||||||
if ui_yesno "Zugangsdaten pruefen" \
|
if ui_yesno "Zugangsdaten pruefen" \
|
||||||
|
|||||||
Reference in New Issue
Block a user