You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2024/10/24 13:02:38 UTC
(camel-karavan) 03/09: Docker Improvements
This is an automated email from the ASF dual-hosted git repository.
marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
commit fa5528fad4a8f40af80328c2d38e6c2f3a6a16bb
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:00:27 2024 -0400
Docker Improvements
---
.../camel/karavan/docker/DockerEventHandler.java | 4 +--
.../camel/karavan/docker/DockerForKaravan.java | 33 +++++++++++++---------
.../apache/camel/karavan/docker/DockerService.java | 12 ++++----
.../apache/camel/karavan/docker/DockerUtils.java | 30 ++++++++++----------
.../karavan/scheduler/DockerStatusScheduler.java | 4 +--
5 files changed, 44 insertions(+), 39 deletions(-)
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
index cdda60df..f368a42f 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
@@ -25,7 +25,7 @@ import io.vertx.core.json.JsonObject;
import io.vertx.mutiny.core.eventbus.EventBus;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
-import org.apache.camel.karavan.model.PodContainerStatus;
+import org.apache.camel.karavan.model.ContainerType;
import org.apache.camel.karavan.service.RegistryService;
import org.jboss.logging.Logger;
@@ -71,7 +71,7 @@ public class DockerEventHandler implements ResultCallback<Event> {
public void onContainerEvent(Event event, Container container) throws InterruptedException {
if ("exited".equalsIgnoreCase(container.getState())
- && Objects.equals(container.getLabels().get(LABEL_TYPE), PodContainerStatus.ContainerType.build.name())) {
+ && Objects.equals(container.getLabels().get(LABEL_TYPE), ContainerType.build.name())) {
String tag = container.getLabels().get(LABEL_TAG);
String projectId = container.getLabels().get(LABEL_PROJECT_ID);
syncImage(projectId, tag);
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
index a1804dd9..22f6b319 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
@@ -22,14 +22,14 @@ import com.github.dockerjava.api.model.MountType;
import com.github.dockerjava.api.model.RestartPolicy;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
-import org.apache.camel.karavan.model.*;
+import org.apache.camel.karavan.model.ContainerType;
+import org.apache.camel.karavan.model.DockerComposeService;
+import org.apache.camel.karavan.model.DockerComposeVolume;
+import org.apache.camel.karavan.model.Project;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.jboss.logging.Logger;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
import static org.apache.camel.karavan.KaravanConstants.*;
import static org.apache.camel.karavan.service.CodeService.BUILD_SCRIPT_FILENAME;
@@ -49,21 +49,21 @@ public class DockerForKaravan {
DockerService dockerService;
public void runProjectInDevMode(String projectId, String jBangOptions, DockerComposeService composeService,
- Map<String, String> files, String projectDevmodeImage) throws Exception {
- Container c = createDevmodeContainer(projectId, jBangOptions, composeService, projectDevmodeImage);
+ Map<String, String> files, String projectDevmodeImage, Map<String, String> labels, Map<String, String> envVars) throws Exception {
+ Container c = createDevmodeContainer(projectId, jBangOptions, composeService, projectDevmodeImage, labels, envVars);
dockerService.runContainer(projectId);
dockerService.copyFiles(c.getId(), "/karavan/code", files, true);
}
protected Container createDevmodeContainer(String projectId, String jBangOptions, DockerComposeService compose,
- String projectDevmodeImage) throws InterruptedException {
+ String projectDevmodeImage, Map<String, String> labels, Map<String, String> envVars) throws InterruptedException {
LOGGER.infof("DevMode starting for %s with JBANG_OPTIONS=%s", projectId, jBangOptions);
HealthCheck healthCheck = new HealthCheck().withTest(List.of("CMD", "curl", "-f", "http://localhost:8080/q/dev/health"))
.withInterval(10000000000L).withTimeout(10000000000L).withStartPeriod(10000000000L).withRetries(30);
List<String> env = new ArrayList<>(compose.getEnvironmentList());
-
+ envVars.forEach((k,v) -> env.add(k + "=" + v));
if (jBangOptions != null && !jBangOptions.trim().isEmpty()) {
env.add(ENV_VAR_JBANG_OPTIONS + "=" + jBangOptions);
}
@@ -74,13 +74,15 @@ public class DockerForKaravan {
var imageName = projectDevmodeImage != null ? projectDevmodeImage : devmodeImage;
+ var containerLabels = new HashMap<>(labels);
+ containerLabels.put(LABEL_TYPE, ContainerType.devmode.name());
+ containerLabels.put(LABEL_PROJECT_ID, projectId);
+ containerLabels.put(LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue());
+
return dockerService.createContainer(projectId,
(imageName),
env, compose.getPortsMap(), healthCheck,
- Map.of(LABEL_TYPE, PodContainerStatus.ContainerType.devmode.name(),
- LABEL_PROJECT_ID, projectId,
- LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue()
- ),
+ containerLabels,
compose.getVolumes(), null, RestartPolicy.noRestart(), DockerService.PULL_IMAGE.ifNotExists,
compose.getCpus(), compose.getCpu_percent(), compose.getMem_limit(), compose.getMem_reservation());
}
@@ -88,6 +90,9 @@ public class DockerForKaravan {
public void runBuildProject(Project project, String script, DockerComposeService compose, Map<String, String> sshFiles, String tag) throws Exception {
String containerName = project.getProjectId() + BUILDER_SUFFIX;
dockerService.deleteContainer(containerName);
+ if (createM2.orElse(false)) {
+ compose.getVolumes().add(new DockerComposeVolume(MountType.VOLUME.name(), project.getProjectId() + "-build-m2-repository", "/karavan/.m2/repository"));
+ }
Container c = createBuildContainer(containerName, project, compose.getEnvironmentList(), compose.getVolumes(), tag);
dockerService.copyExecFile(c.getId(), "/karavan/builder", BUILD_SCRIPT_FILENAME, script);
sshFiles.forEach((name, text) -> {
@@ -102,7 +107,7 @@ public class DockerForKaravan {
return dockerService.createContainer(containerName, devmodeImage,
env, Map.of(), new HealthCheck(),
Map.of(
- LABEL_TYPE, PodContainerStatus.ContainerType.build.name(),
+ LABEL_TYPE, ContainerType.build.name(),
LABEL_PROJECT_ID, project.getProjectId(),
LABEL_TAG, tag
),
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
index 025077c7..8d944295 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
@@ -33,9 +33,9 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
import org.apache.camel.karavan.model.ContainerImage;
+import org.apache.camel.karavan.model.ContainerType;
import org.apache.camel.karavan.model.DockerComposeService;
import org.apache.camel.karavan.model.DockerComposeVolume;
-import org.apache.camel.karavan.model.PodContainerStatus;
import org.apache.camel.karavan.service.CodeService;
import org.apache.camel.karavan.service.ConfigService;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
@@ -181,13 +181,13 @@ public class DockerService {
String... command) throws InterruptedException {
List<Container> containers = findContainer(name);
if (containers.isEmpty()) {
- if (Objects.equals(labels.get(LABEL_TYPE), PodContainerStatus.ContainerType.devmode.name())
- || Objects.equals(labels.get(LABEL_TYPE), PodContainerStatus.ContainerType.build.name())
- || Objects.equals(labels.get(LABEL_TYPE), PodContainerStatus.ContainerType.devservice.name())) {
+ if (Objects.equals(labels.get(LABEL_TYPE), ContainerType.devmode.name())
+ || Objects.equals(labels.get(LABEL_TYPE), ContainerType.build.name())
+ || Objects.equals(labels.get(LABEL_TYPE), ContainerType.devservice.name())) {
LOGGER.info("Pulling DevMode image from DockerHub: " + image);
pullImageFromDockerHub(image, Objects.equals(pullImage, PULL_IMAGE.always));
}
- if (Objects.equals(labels.get(LABEL_TYPE), PodContainerStatus.ContainerType.project.name())) {
+ if (Objects.equals(labels.get(LABEL_TYPE), ContainerType.project.name())) {
LOGGER.info("Pulling Project image from Registry: " + image);
pullImage(image, Objects.equals(pullImage, PULL_IMAGE.always));
}
@@ -208,7 +208,7 @@ public class DockerService {
if (command.length > 0) {
createContainerCmd.withCmd(command);
}
- if (Objects.equals(labels.get(LABEL_PROJECT_ID), PodContainerStatus.ContainerType.build.name())) {
+ if (Objects.equals(labels.get(LABEL_PROJECT_ID), ContainerType.build.name())) {
mounts.add(new Mount().withType(MountType.BIND).withSource("/var/run/docker.sock").withTarget("/var/run/docker.sock"));
}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerUtils.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerUtils.java
index a4c71beb..1f85f119 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerUtils.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerUtils.java
@@ -19,6 +19,7 @@ package org.apache.camel.karavan.docker;
import com.github.dockerjava.api.model.*;
import io.smallrye.mutiny.tuples.Tuple2;
import org.apache.camel.karavan.model.ContainerPort;
+import org.apache.camel.karavan.model.ContainerType;
import org.apache.camel.karavan.model.DockerComposeHealthCheck;
import org.apache.camel.karavan.model.PodContainerStatus;
@@ -96,7 +97,6 @@ public class DockerUtils {
static Ports getPortBindings(Map<Integer, Integer> ports) {
Ports portBindings = new Ports();
-
ports.forEach((hostPort, containerPort) -> {
Ports.Binding binding = Ports.Binding.bindPort(hostPort);
portBindings.bind(ExposedPort.tcp(containerPort), binding);
@@ -110,12 +110,12 @@ public class DockerUtils {
.map(p -> new ContainerPort(p.getPrivatePort(), p.getPublicPort(), p.getType()))
.collect(Collectors.toList());
List<PodContainerStatus.Command> commands = getContainerCommand(container.getState());
- PodContainerStatus.ContainerType type = getContainerType(container.getLabels());
+ ContainerType type = getContainerType(container.getLabels());
String created = Instant.ofEpochSecond(container.getCreated()).toString();
String projectId = container.getLabels().getOrDefault(LABEL_PROJECT_ID, name);
String camelRuntime = container.getLabels().getOrDefault(LABEL_CAMEL_RUNTIME, "");
return PodContainerStatus.createWithId(projectId, name, environment, container.getId(), container.getImage(),
- ports, type, commands, container.getState(), created, camelRuntime);
+ ports, type, commands, container.getState(), created, camelRuntime, container.getLabels());
}
public static void updateStatistics(PodContainerStatus podContainerStatus, Statistics stats) {
@@ -160,20 +160,20 @@ public class DockerUtils {
}
}
- static PodContainerStatus.ContainerType getContainerType(Map<String, String> labels) {
+ static ContainerType getContainerType(Map<String, String> labels) {
String type = labels.get(LABEL_TYPE);
- if (Objects.equals(type, PodContainerStatus.ContainerType.devmode.name())) {
- return PodContainerStatus.ContainerType.devmode;
- } else if (Objects.equals(type, PodContainerStatus.ContainerType.devservice.name())) {
- return PodContainerStatus.ContainerType.devservice;
- } else if (Objects.equals(type, PodContainerStatus.ContainerType.project.name())) {
- return PodContainerStatus.ContainerType.project;
- } else if (Objects.equals(type, PodContainerStatus.ContainerType.internal.name())) {
- return PodContainerStatus.ContainerType.internal;
- } else if (Objects.equals(type, PodContainerStatus.ContainerType.build.name())) {
- return PodContainerStatus.ContainerType.build;
+ if (Objects.equals(type, ContainerType.devmode.name())) {
+ return ContainerType.devmode;
+ } else if (Objects.equals(type, ContainerType.devservice.name())) {
+ return ContainerType.devservice;
+ } else if (Objects.equals(type, ContainerType.project.name())) {
+ return ContainerType.project;
+ } else if (Objects.equals(type, ContainerType.internal.name())) {
+ return ContainerType.internal;
+ } else if (Objects.equals(type, ContainerType.build.name())) {
+ return ContainerType.build;
}
- return PodContainerStatus.ContainerType.unknown;
+ return ContainerType.unknown;
}
static List<PodContainerStatus.Command> getContainerCommand(String state) {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
index 2de5ed0a..94788ad5 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
@@ -46,7 +46,7 @@ public class DockerStatusScheduler {
@Inject
EventBus eventBus;
- @Scheduled(every = "{karavan.container.statistics.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+ @Scheduled(every = "{karavan.container.statistics.interval:off}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
void collectContainersStatistics() {
if (!ConfigService.inKubernetes()) {
List<PodContainerStatus> statusesInDocker = getContainersStatuses();
@@ -56,7 +56,7 @@ public class DockerStatusScheduler {
}
}
- @Scheduled(every = "{karavan.container.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+ @Scheduled(every = "{karavan.container.status.interval:off}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
void collectContainersStatuses() {
if (!ConfigService.inKubernetes()) {
List<PodContainerStatus> statusesInDocker = getContainersStatuses();