v1.5.1-rc.4
Full Changelog: v1.5.1-rc.3...v1.5.1-rc.4
[1.5.1-rc.4] — 2026-06-29
Added
-
Optional mount-prefix fallback for Docker Compose path matching. When a watched container's resolved compose file path differs from the trigger's configured compose file only by a mount prefix (common with Portainer and bind-mounted compose files), drydock can now match on the trailing
<project-dir>/<file>tail instead of skipping the container. Off by default — enable it per trigger withDD_ACTION_DOCKERCOMPOSE_<name>_MOUNT_PREFIX_FALLBACK=true. It stays opt-in because tail matching cannot distinguish two stacks that share a project-directory name across environments (e.g./prod/myappvs/staging/myapp). (#365) -
$currentReleaseNotestrigger template variable. Trigger templates (notification bodies, command arguments, and the like) can now reference$currentReleaseNotesto include the release notes for the container's currently running version, alongside the existing variable for the update target's notes. (#295) -
Container software version in the detail panels and a new Version column in the containers table. Drydock now surfaces the application version baked into an image — read from the
org.opencontainers.image.versionOCI label, falling back to the running container's inspect metadata — asimage.softwareVersion. It appears in the container side panel, the full-page detail view, and a new Version column in the containers table. The existing Tag column (column keyversion, preserved so saved column preferences keep working) continues to show the image tag; the new Version column showsimage.softwareVersion, falling back to the tag when no software version is available.dd.inspect.tag.pathnow dual-writes the extracted value intoimage.softwareVersionas well as overwriting the image tag, so the Version column is populated for inspect-path containers with no label change needed. The Version column is visible by default for new installs; existing users have it inserted into their saved column list automatically on first load after upgrading. (#209) -
dd.inspect.tag.version-onlyopt-in label. Whendd.inspect.tag.pathis set, the extracted value normally overwrites the image tag (enabling update detection against the semver embedded in the running container). Settingdd.inspect.tag.version-only=trueroutes the extracted value toimage.softwareVersiononly, leaving the real image tag intact for update detection. This is useful when the inspect path carries a displayable application version that differs in format from the registry tag — the Version column shows it without disrupting how drydock matches updates. The default (tag overwrite) is unchanged when the label is absent. (#209) -
Container uptime. The side panel and full-page detail view now show how long a container has been running (from the Docker
State.StartedAttimestamp), and a new opt-in Uptime column can be enabled in the containers table via the column picker. The value updates live and falls back to an em-dash when the start time is unknown.
Changed
- Container validation now tolerates fields written by newer drydock versions. The store validator no longer rejects unknown keys, so a
dd.jsonwritten by a newer release stays readable after a downgrade. Note: this protects downgrades from v1.5.1 onward — rolling back from v1.5.1 to v1.5.0 (which predates this change) still requires removing the newdetails.startedAtandimage.softwareVersionfields fromdd.json, since v1.5.0 rejects them.
Fixed
- Completed i18n coverage for the last untranslated UI surfaces. A code-level audit found several strings that still rendered in English for non-English users; they now resolve through the translation catalog: the trigger status badge (
active/inactive), the running/writes-composeyes/nopreview values, the "container actions disabled by server configuration" tooltip, the update-maturity "Available for N days" tooltip (the translate function is now threaded through the container mapper, which previously left the existing catalog keys unused), the grouped "Update All" success toast (which appended a raw Englishin <group>— it now interpolates the group name through a translatable key), the security-view severity tooltips (CRITICAL/HIGH/MEDIUM/LOW), the backup operationunknownfallback label, and the search-bar hint footer connectors. The new English catalog keys ship now; the 16 community locales fill in through the normal Crowdin sync after release. (#329)
Security
- Base image refreshed to clear 24 container-scan CVEs. Bumped the pinned
node:24-alpinebase from a stale digest (Node 24.16.0, Alpine 3.21) to the current digest (Node 24.18.0, Alpine 3.24) and addedlibexpatto the targetedapk upgradeset. This resolves all 11 Node binary CVEs reported by the image scan — including the one critical (CVE-2026-48930) and four high — plus 13 mediumlibexpatCVEs (now2.8.2-r0). A rebuild + rescan confirms zero critical/high/Node/libexpat findings remain. The threebusybox/ssl_clientfindings (CVE-2025-60876, medium) have no upstream fix in Alpine yet and are tracked for a later base bump. All previously pinned Alpine package versions still resolve on 3.24, so the build is otherwise unchanged.
Warning
Upgrade notes: behavioral changes, please read before updating. Three security-hardening fixes that change runtime behavior first shipped in 1.4.6 and carry through the entire 1.5 line. Anyone updating from a release older than 1.4.6 is affected, whatever version you land on (1.4.6, any 1.5.x, or later), because these changes sit across the 1.4.6 boundary rather than in one specific version. These are not deprecations: there is no compatibility shim or grace period, so a previously-working deployment can change behavior on upgrade.
- OIDC login now requires
authorization_endpointin your provider's discovery metadata. The authorization-redirect allowlist no longer falls back to a broad same-origin match. Mainstream identity providers (Keycloak, Authentik, Authelia, Okta, Google, Entra/Azure AD, Zitadel, …) publish this field and are unaffected. If your/.well-known/openid-configurationdoes not advertiseauthorization_endpoint, OIDC sign-in will now fail closed — make sure the discovery document exposes it. - Unauthenticated rate-limit buckets now key on the TCP peer address instead of
X-Forwarded-For. Behind a reverse proxy (nginx / Traefik / Caddy), all unauthenticated clients now share a single bucket (the proxy's address), regardless ofDD_SERVER_TRUSTPROXY. Internet-facing or multi-user instances may begin to see unexpected429 Too Many Requestson unauthenticated endpoints. Authenticated requests are keyed per session and are unaffected. - HTTP-trigger
proxyURLs must now use thehttp://orhttps://scheme. Any other scheme (e.g.socks5://) is rejected at config load. Such values were previously accepted but only ever treated as an HTTP proxy — switch to anhttp(s)://proxy URL.