From 1077293343318368fc9e98616c8fad27a6235007 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Wed, 15 Apr 2026 11:29:58 +0200 Subject: [PATCH] fix: pull base image on deploy and fix registry prefix default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The PULL_IMAGE deploy stage was a no-op — Docker only pulls on create if the image is missing entirely, not when a newer version exists. DeploymentExecutor now calls orchestrator.pullImage() to fetch the latest base image from the registry before creating containers. Also fixes the default base image from 'cameleer-runtime-base:latest' (local-only name) to the fully qualified registry path 'gitea.siegeln.net/cameleer/cameleer-runtime-base:latest'. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../server/app/runtime/DeploymentExecutor.java | 4 ++-- .../app/runtime/DockerRuntimeOrchestrator.java | 14 ++++++++++++++ .../src/main/resources/application.yml | 2 +- .../server/core/runtime/RuntimeOrchestrator.java | 2 ++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java index 814a4cdc..f73c7f03 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DeploymentExecutor.java @@ -29,7 +29,7 @@ public class DeploymentExecutor { @Autowired(required = false) private DockerNetworkManager networkManager; - @Value("${cameleer.server.runtime.baseimage:cameleer-runtime-base:latest}") + @Value("${cameleer.server.runtime.baseimage:gitea.siegeln.net/cameleer/cameleer-runtime-base:latest}") private String baseImage; @Value("${cameleer.server.runtime.dockernetwork:cameleer}") @@ -133,7 +133,7 @@ public class DeploymentExecutor { // === PULL IMAGE === updateStage(deployment.id(), DeployStage.PULL_IMAGE); - // Docker pulls on create if not present locally + orchestrator.pullImage(baseImage); // === CREATE NETWORKS === updateStage(deployment.id(), DeployStage.CREATE_NETWORK); diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DockerRuntimeOrchestrator.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DockerRuntimeOrchestrator.java index 3222448d..7701243c 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DockerRuntimeOrchestrator.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/runtime/DockerRuntimeOrchestrator.java @@ -49,6 +49,20 @@ public class DockerRuntimeOrchestrator implements RuntimeOrchestrator { return true; } + @Override + public void pullImage(String image) { + try { + log.info("Pulling image {}", image); + dockerClient.pullImageCmd(image).start().awaitCompletion(); + log.info("Image pulled: {}", image); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.warn("Image pull interrupted for {}", image); + } catch (Exception e) { + log.warn("Failed to pull image {} (will use local cache if available): {}", image, e.getMessage()); + } + } + @Override public String startContainer(ContainerRequest request) { List envList = request.envVars().entrySet().stream() diff --git a/cameleer3-server-app/src/main/resources/application.yml b/cameleer3-server-app/src/main/resources/application.yml index a7b2ef5b..5caefa28 100644 --- a/cameleer3-server-app/src/main/resources/application.yml +++ b/cameleer3-server-app/src/main/resources/application.yml @@ -43,7 +43,7 @@ cameleer: runtime: enabled: ${CAMELEER_SERVER_RUNTIME_ENABLED:true} jarstoragepath: ${CAMELEER_SERVER_RUNTIME_JARSTORAGEPATH:/data/jars} - baseimage: ${CAMELEER_SERVER_RUNTIME_BASEIMAGE:cameleer-runtime-base:latest} + baseimage: ${CAMELEER_SERVER_RUNTIME_BASEIMAGE:gitea.siegeln.net/cameleer/cameleer-runtime-base:latest} dockernetwork: ${CAMELEER_SERVER_RUNTIME_DOCKERNETWORK:cameleer} agenthealthport: 9464 healthchecktimeout: 60 diff --git a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/RuntimeOrchestrator.java b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/RuntimeOrchestrator.java index 86fc74b3..b0f7292b 100644 --- a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/RuntimeOrchestrator.java +++ b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/runtime/RuntimeOrchestrator.java @@ -4,6 +4,8 @@ import java.util.stream.Stream; public interface RuntimeOrchestrator { boolean isEnabled(); + /** Pull the latest version of a container image from the registry. */ + default void pullImage(String image) {} String startContainer(ContainerRequest request); void stopContainer(String containerId); void removeContainer(String containerId);