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);