in karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java [177:239]
public Container createContainer(String name, String image, List<String> env, Map<Integer, Integer> ports,
HealthCheck healthCheck, Map<String, String> labels,
List<DockerComposeVolume> volumes, String network, RestartPolicy restartPolicy,
PULL_IMAGE pullImage, String cpus, String cpu_percent, String mem_limit, String mem_reservation,
String dockerCommand) throws InterruptedException {
List<Container> containers = findContainer(name);
if (containers.isEmpty()) {
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), ContainerType.packaged.name())) {
LOGGER.info("Pulling Project image from Registry: " + image);
pullImage(image, Objects.equals(pullImage, PULL_IMAGE.always));
}
Ports portBindings = DockerUtils.getPortBindings(ports);
List<ExposedPort> exposePorts = DockerUtils.getExposedPorts(ports);
try (CreateContainerCmd createContainerCmd = getDockerClient().createContainerCmd(image)
.withName(name).withLabels(labels).withEnv(env).withHostName(name).withExposedPorts(exposePorts).withHealthcheck(healthCheck)) {
List<Mount> mounts = new ArrayList<>();
if (volumes != null && !volumes.isEmpty()) {
volumes.forEach(volume -> {
var mount = new Mount().withType(MountType.valueOf(volume.getType().toUpperCase())).withTarget(volume.getTarget());
if (volume.getSource() != null) {
mount = mount.withSource(volume.getSource());
}
mounts.add(mount);
});
}
if (dockerCommand != null) {
createContainerCmd.withCmd("/bin/sh", "-c", dockerCommand);
System.out.println(dockerCommand);
}
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"));
}
createContainerCmd.withHostConfig(new HostConfig()
.withRestartPolicy(restartPolicy)
.withPortBindings(portBindings)
.withMounts(mounts)
.withMemory(DockerUtils.parseMemory(mem_limit))
.withMemoryReservation(DockerUtils.parseMemory(mem_reservation))
.withCpuPercent(NumberUtils.toLong(cpu_percent))
.withNanoCPUs(NumberUtils.toLong(cpus))
.withNetworkMode(network != null ? network : networkName));
CreateContainerResponse response = createContainerCmd.exec();
LOGGER.info("Container created: " + response.getId());
try (ListContainersCmd cmd = getDockerClient().listContainersCmd().withShowAll(true).withIdFilter(Collections.singleton(response.getId()))) {
return cmd.exec().get(0);
}
}
} else {
LOGGER.info("Container already exists: " + containers.get(0).getId());
return containers.get(0);
}
}