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:
2026-09-20 15:58:39 +02:00
co-authored by Claude Opus 5
parent ed052cd62f
commit 7a93dd5dbf
3 changed files with 164 additions and 5 deletions
+48 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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" \