This commit is contained in:
jarek committed 2026-07-25 08:41:01 +02:00
1 parent 9f09d60a83
commit 64b6dcd744
177 files changed
+21182 -1042

No files matched your search

@@ -9,7 +9,8 @@ import {
isDigestBasedImage,
getImageIdByTag,
removeTempImage,
tagImage
tagImage,
inspectImage
} from '$lib/server/docker';
import { auditContainer } from '$lib/server/audit';
import { getScannerSettings, scanImage } from '$lib/server/scanner';
@@ -157,6 +158,17 @@ export const POST: RequestHandler = async (event) => {
const imageName = config.Image;
const currentImageId = inspectData.Image;
// Capture the OLD image's Env/Labels BEFORE pulling — once the tag is
// repointed the old digest may be untagged/GC'd and un-inspectable.
// Used by the env/label rebase in recreateContainer (#1226, #1256).
let oldImageConfig: { Env?: string[]; Labels?: Record<string, string> } | null = null;
try {
const oldImg = await inspectImage(currentImageId, envIdNum) as any;
oldImageConfig = { Env: oldImg?.Config?.Env, Labels: oldImg?.Config?.Labels };
} catch {
// Best-effort; rebase will fall back if unavailable.
}
// Skip system containers (Dockhand, Hawser)
const systemType = isSystemContainer(imageName);
if (systemType) {
@@ -459,7 +471,11 @@ export const POST: RequestHandler = async (event) => {
message: `Recreating ${containerName}...`
});
const recreateResult = await recreateContainer(containerName, envIdNum, logProgress, imageName);
const recreateResult = await recreateContainer(containerName, envIdNum, {
log: logProgress,
imageNameOverride: imageName,
oldImageConfig
});
if (recreateResult.success) {
const updatedContainers = await listContainers(true, envIdNum);
const updatedContainer = updatedContainers.find(c => c.name === containerName);
@@ -1,7 +1,7 @@
import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { authorize } from '$lib/server/authorize';
import { listContainers, pullImage, inspectContainer } from '$lib/server/docker';
import { listContainers, pullImage, inspectContainer, inspectImage } from '$lib/server/docker';
import { auditContainer } from '$lib/server/audit';
import { recreateContainer } from '$lib/server/scheduler/tasks/container-update';
import { isUpdateDisabledByLabel } from '$lib/server/container-labels';
@@ -63,6 +63,16 @@ export const POST: RequestHandler = async (event) => {
const imageName = config.Image;
const containerName = container.name;
// Capture the OLD image's Env/Labels BEFORE the pull for the env/label
// rebase (#1226, #1256) — the old digest may be GC'd after the pull.
let oldImageConfig: { Env?: string[]; Labels?: Record<string, string> } | null = null;
try {
const oldImg = await inspectImage(inspectData.Image, envIdNum) as any;
oldImageConfig = { Env: oldImg?.Config?.Env, Labels: oldImg?.Config?.Labels };
} catch {
// Best-effort; rebase falls back if unavailable.
}
// Skip containers with dockhand.update=false label
if (isUpdateDisabledByLabel(config.Labels)) {
results.push({
@@ -89,7 +99,7 @@ export const POST: RequestHandler = async (event) => {
let newContainerId = containerId;
const recreateResult = await recreateContainer(containerName, envIdNum);
const recreateResult = await recreateContainer(containerName, envIdNum, { oldImageConfig });
if (recreateResult.success) {
const updatedContainers = await listContainers(true, envIdNum);
const updatedContainer = updatedContainers.find(c => c.name === containerName);