2025-10-16 15:15:57 +02:00

256 lines
8.7 KiB
Java

package fr.la_banquise.backend.services;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.BuildImageResultCallback;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.model.Container;
import com.github.dockerjava.api.model.ContainerPort;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.Ports;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.ArrayList;
import fr.la_banquise.backend.rest.response.DockerResponse;
@ApplicationScoped
public class DockerService {
@Inject
DockerClient dockerClient;
public String createAndStartNginx() {
ExposedPort tcp80 = ExposedPort.tcp(80);
Ports portBindings = new Ports();
portBindings.bind(tcp80, Ports.Binding.bindPort(8081));
HostConfig hostConfig = HostConfig.newHostConfig().withPortBindings(portBindings);
Map<String, String> labels = new HashMap<>();
labels.put("test", "banquise");
labels.put("environment", "development");
labels.put("version", "1.0");
labels.put("created-by", "java-docker-api");
CreateContainerResponse container = dockerClient.createContainerCmd("nginx:latest")
.withName("my-nginx")
.withLabels(labels)
.withExposedPorts(tcp80)
.withHostConfig(hostConfig)
.exec();
dockerClient.startContainerCmd(container.getId()).exec();
return container.getId();
}
/*
* public String listAllContainers() {
* StringBuilder json = new StringBuilder();
* List<Container> containers = dockerClient.listContainersCmd()
* .withShowAll(true)
* .exec();
*
* json.append("[");
*
* for (int i = 0; i < containers.size(); i++) {
* Container container = containers.get(i);
*
* json.append("{");
* json.append("\"name\":\"").append(container.getNames()[0].substring(1)).
* append("\",");
* json.append("\"id\":\"").append(container.getId()).append("\",");
* json.append("\"image\":\"").append(container.getImage()).append("\",");
* json.append("\"status\":\"").append(container.getStatus()).append("\",");
*
* // Ports
* InspectContainerResponse inspectResponse =
* dockerClient.inspectContainerCmd(container.getId()).exec();
* json.append("\"ports\":[");
* if (container.getPorts() != null && container.getPorts().length > 0) {
* for (int j = 0; j < .length; j+=2) {
* ContainerPort port = container.getPorts()[j];
* json.append("[\"");
* json.append(port.getPrivatePort()).append("->").append(port.getPublicPort()).
* append("/"+port.getType()+"\",\"");
* json.append(port.getIp()).append(",").append((container.getPorts()[j+1]).
* getIp());
* if (port.getType() != null) {
* json.append("/").append(port.getType());
* }
* if (port.getPublicPort() != null) {
* json.append("->").append(port.getPublicPort());
* }*
* json.append("\"]");
* if (j < container.getPorts().length - 2) {
* json.append(",");
* }
* }
* }
* json.append("]");
*
* // Ports
* String ports = "[]";
* try {
* InspectContainerResponse inspectResponse =
* dockerClient.inspectContainerCmd(container.getId()).exec(); if
* (inspectResponse.getConfig().getExposedPorts() != null) { ports =
* inspectResponse.getConfig().getExposedPorts().toString();
* }
* } catch (Exception e) {
* // Fallback vers les ports runtime si inspect échoue
* if (container.getPorts() != null && container.getPorts().length
* > 0) { ports = java.util.Arrays.toString(container.getPorts());
* }
* }
* json.append("\"ports\":\"").append(ports).append("\"");
* json.append("}");
* if (i < containers.size() - 1) {
* json.append(",");
* }
*
* json.append("}");
*
* if (i < containers.size() - 1) {
* json.append(",");
* }
* }
*
* json.append("]");
* return json.toString();
* }
* public String listAllContainers() {
* StringBuilder json = new StringBuilder();
* List<Container> containers = dockerClient.listContainersCmd()
* .withShowAll(true)
* .exec();
* json.append("[");
* for (int i = 0; i < containers.size(); i++) {
* Container container = containers.get(i);
* // Ports
* List<String> portsList = new ArrayList<>();
* try {
* var inspectResponse =
* dockerClient.inspectContainerCmd(container.getId()).exec(); if
* (inspectResponse.getConfig().getExposedPorts() != null) { var exposedPorts =
* inspectResponse.getConfig().getExposedPorts(); int count = 0; for (var port
* : exposedPorts) { if (count > 0) portsList.append(",");
* portsList.append(String.format("\"%s\"",
* port.toString())); count = 1;
* }
* portsList.append("]");
* ports = portsList.toString();
* }
* } catch (Exception e) {
* // Fallback vers les ports runtime si inspect échoue
* if (container.getPorts() != null && container.getPorts().length
* > 0) { ports = java.util.Arrays.toString(container.getPorts());
* }
* }
*
* //json.append(containerJson);
*
* if (i < containers.size() - 1) {
* json.append(",");
* }
* }
* json.append("]");
* return json.toString();
* }
*/
////////////////////
public String createContainer(String name, int port) {
ExposedPort tcpSsh = ExposedPort.tcp(2222);
Ports portBindings = new Ports();
portBindings.bind(tcpSsh, Ports.Binding.bindPort(port));
HostConfig hostConfig = HostConfig.newHostConfig().withPortBindings(portBindings);
Map<String, String> labels = new HashMap<>();
labels.put("test", "banquise");
labels.put("environment", "development");
labels.put("version", "1.0");
labels.put("created-by", "java-docker-api");
dockerClient.buildImageCmd()
.withDockerfile(new File("./dockerfile/Dockerfile"))
.withBaseDirectory(new File("./dockerfile"))
.withTags(Set.of("ji-python:latest"))
.exec(new BuildImageResultCallback())
.awaitImageId();
CreateContainerResponse container = dockerClient.createContainerCmd("ji-python:latest")
.withName(name)
.withLabels(labels)
.withExposedPorts(tcpSsh)
.withHostConfig(hostConfig)
.withEnv(
"SUDO_ACCESS=false",
"PASSWORD_ACCESS=true",
"USER_NAME=test", // TODO: CHANGE THIS
"USER_PASSWORD=test" // AND this also oc
)
.exec();
return container.getId();
}
public InspectContainerResponse.ContainerState getStatusContainer(String name) {
InspectContainerResponse container = dockerClient.inspectContainerCmd(name).exec();
return container.getState();
}
public boolean remove(String name) {
try {
dockerClient.removeContainerCmd(name).exec();
return true;
} catch (Exception e) {
return false;
}
}
public boolean containerExists(String name) {
try {
dockerClient.inspectContainerCmd(name).exec();
return true;
} catch (Exception e) {
return false;
}
}
public void start(String containerId) {
dockerClient.startContainerCmd(containerId).exec();
}
public void stop(String containerId) {
dockerClient.stopContainerCmd(containerId).exec();
}
public List<DockerResponse> listAllContainers() {
List<Container> containers = dockerClient.listContainersCmd()
.withShowAll(true)
.exec();
return containers.stream().map(this::toDockerResponse).toList();
}
private DockerResponse toDockerResponse(Container container) {
List<String> portsList = new ArrayList<>();
for (var port : container.getPorts()) {
portsList.add(String.format("%s:%s", port.getPrivatePort(), port.getPublicPort()));
}
return new DockerResponse(container.getNames()[0].substring(1), container.getStatus(), container.getImage(),
portsList);
}
}