feat(docker): revamped docker response

This commit is contained in:
Malopieds 2025-10-16 15:15:57 +02:00
parent f00f12ac42
commit 8cf624e39b
2 changed files with 161 additions and 136 deletions

View File

@ -0,0 +1,15 @@
package fr.la_banquise.backend.rest.response;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
public class DockerResponse {
public String name;
public String state;
public String image;
public List<String> publicPorts;
}

View File

@ -19,11 +19,14 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.ArrayList;
import fr.la_banquise.backend.rest.response.DockerResponse;
@ApplicationScoped @ApplicationScoped
public class DockerService { public class DockerService {
@Inject DockerClient dockerClient; @Inject
DockerClient dockerClient;
public String createAndStartNginx() { public String createAndStartNginx() {
ExposedPort tcp80 = ExposedPort.tcp(80); ExposedPort tcp80 = ExposedPort.tcp(80);
@ -31,16 +34,14 @@ public class DockerService {
Ports portBindings = new Ports(); Ports portBindings = new Ports();
portBindings.bind(tcp80, Ports.Binding.bindPort(8081)); portBindings.bind(tcp80, Ports.Binding.bindPort(8081));
HostConfig hostConfig = HostConfig hostConfig = HostConfig.newHostConfig().withPortBindings(portBindings);
HostConfig.newHostConfig().withPortBindings(portBindings);
Map<String, String> labels = new HashMap<>(); Map<String, String> labels = new HashMap<>();
labels.put("test", "banquise"); labels.put("test", "banquise");
labels.put("environment", "development"); labels.put("environment", "development");
labels.put("version", "1.0"); labels.put("version", "1.0");
labels.put("created-by", "java-docker-api"); labels.put("created-by", "java-docker-api");
CreateContainerResponse container = CreateContainerResponse container = dockerClient.createContainerCmd("nginx:latest")
dockerClient.createContainerCmd("nginx:latest")
.withName("my-nginx") .withName("my-nginx")
.withLabels(labels) .withLabels(labels)
.withExposedPorts(tcp80) .withExposedPorts(tcp80)
@ -51,118 +52,120 @@ public class DockerService {
return container.getId(); return container.getId();
} }
/* /*
public String listAllContainers() { * public String listAllContainers() {
StringBuilder json = new StringBuilder(); * StringBuilder json = new StringBuilder();
List<Container> containers = dockerClient.listContainersCmd() * List<Container> containers = dockerClient.listContainersCmd()
.withShowAll(true) * .withShowAll(true)
.exec(); * .exec();
*
json.append("["); * json.append("[");
*
for (int i = 0; i < containers.size(); i++) { * for (int i = 0; i < containers.size(); i++) {
Container container = containers.get(i); * Container container = containers.get(i);
*
json.append("{"); * json.append("{");
json.append("\"name\":\"").append(container.getNames()[0].substring(1)).append("\","); * json.append("\"name\":\"").append(container.getNames()[0].substring(1)).
json.append("\"id\":\"").append(container.getId()).append("\","); * append("\",");
json.append("\"image\":\"").append(container.getImage()).append("\","); * json.append("\"id\":\"").append(container.getId()).append("\",");
json.append("\"status\":\"").append(container.getStatus()).append("\","); * json.append("\"image\":\"").append(container.getImage()).append("\",");
* json.append("\"status\":\"").append(container.getStatus()).append("\",");
// Ports *
InspectContainerResponse inspectResponse = * // Ports
dockerClient.inspectContainerCmd(container.getId()).exec(); * InspectContainerResponse inspectResponse =
json.append("\"ports\":["); * dockerClient.inspectContainerCmd(container.getId()).exec();
if (container.getPorts() != null && container.getPorts().length > 0) { * json.append("\"ports\":[");
for (int j = 0; j < .length; j+=2) { * if (container.getPorts() != null && container.getPorts().length > 0) {
ContainerPort port = container.getPorts()[j]; * for (int j = 0; j < .length; j+=2) {
json.append("[\""); * ContainerPort port = container.getPorts()[j];
json.append(port.getPrivatePort()).append("->").append(port.getPublicPort()).append("/"+port.getType()+"\",\""); * json.append("[\"");
json.append(port.getIp()).append(",").append((container.getPorts()[j+1]).getIp()); * json.append(port.getPrivatePort()).append("->").append(port.getPublicPort()).
if (port.getType() != null) { * append("/"+port.getType()+"\",\"");
json.append("/").append(port.getType()); * json.append(port.getIp()).append(",").append((container.getPorts()[j+1]).
} * getIp());
if (port.getPublicPort() != null) { * if (port.getType() != null) {
json.append("->").append(port.getPublicPort()); * json.append("/").append(port.getType());
}* * }
json.append("\"]"); * if (port.getPublicPort() != null) {
if (j < container.getPorts().length - 2) { * json.append("->").append(port.getPublicPort());
json.append(","); * }*
} * json.append("\"]");
} * if (j < container.getPorts().length - 2) {
} * json.append(",");
json.append("]"); * }
* }
// Ports * }
String ports = "[]"; * json.append("]");
try { *
InspectContainerResponse inspectResponse = * // Ports
dockerClient.inspectContainerCmd(container.getId()).exec(); if * String ports = "[]";
(inspectResponse.getConfig().getExposedPorts() != null) { ports = * try {
inspectResponse.getConfig().getExposedPorts().toString(); * InspectContainerResponse inspectResponse =
} * dockerClient.inspectContainerCmd(container.getId()).exec(); if
} catch (Exception e) { * (inspectResponse.getConfig().getExposedPorts() != null) { ports =
// Fallback vers les ports runtime si inspect échoue * inspectResponse.getConfig().getExposedPorts().toString();
if (container.getPorts() != null && container.getPorts().length * }
> 0) { ports = java.util.Arrays.toString(container.getPorts()); * } catch (Exception e) {
} * // Fallback vers les ports runtime si inspect échoue
} * if (container.getPorts() != null && container.getPorts().length
json.append("\"ports\":\"").append(ports).append("\""); * > 0) { ports = java.util.Arrays.toString(container.getPorts());
json.append("}"); * }
if (i < containers.size() - 1) { * }
json.append(","); * 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("}");
} *
} * if (i < containers.size() - 1) {
* json.append(",");
json.append("]"); * }
return json.toString(); * }
} *
public String listAllContainers() { * json.append("]");
StringBuilder json = new StringBuilder(); * return json.toString();
List<Container> containers = dockerClient.listContainersCmd() * }
.withShowAll(true) * public String listAllContainers() {
.exec(); * StringBuilder json = new StringBuilder();
json.append("["); * List<Container> containers = dockerClient.listContainersCmd()
for (int i = 0; i < containers.size(); i++) { * .withShowAll(true)
Container container = containers.get(i); * .exec();
// Ports * json.append("[");
List<String> portsList = new ArrayList<>(); * for (int i = 0; i < containers.size(); i++) {
try { * Container container = containers.get(i);
var inspectResponse = * // Ports
dockerClient.inspectContainerCmd(container.getId()).exec(); if * List<String> portsList = new ArrayList<>();
(inspectResponse.getConfig().getExposedPorts() != null) { var exposedPorts = * try {
inspectResponse.getConfig().getExposedPorts(); int count = 0; for (var port * var inspectResponse =
: exposedPorts) { if (count > 0) portsList.append(","); * dockerClient.inspectContainerCmd(container.getId()).exec(); if
portsList.append(String.format("\"%s\"", * (inspectResponse.getConfig().getExposedPorts() != null) { var exposedPorts =
port.toString())); count = 1; * inspectResponse.getConfig().getExposedPorts(); int count = 0; for (var port
} * : exposedPorts) { if (count > 0) portsList.append(",");
portsList.append("]"); * portsList.append(String.format("\"%s\"",
ports = portsList.toString(); * port.toString())); count = 1;
} * }
} catch (Exception e) { * portsList.append("]");
// Fallback vers les ports runtime si inspect échoue * ports = portsList.toString();
if (container.getPorts() != null && container.getPorts().length * }
> 0) { ports = java.util.Arrays.toString(container.getPorts()); * } 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(containerJson);
} *
} * if (i < containers.size() - 1) {
json.append("]"); * json.append(",");
return json.toString(); * }
}*/ * }
* json.append("]");
* return json.toString();
* }
*/
//////////////////// ////////////////////
public String createContainer(String name, int port) { public String createContainer(String name, int port) {
@ -171,8 +174,7 @@ public class DockerService {
Ports portBindings = new Ports(); Ports portBindings = new Ports();
portBindings.bind(tcpSsh, Ports.Binding.bindPort(port)); portBindings.bind(tcpSsh, Ports.Binding.bindPort(port));
HostConfig hostConfig = HostConfig hostConfig = HostConfig.newHostConfig().withPortBindings(portBindings);
HostConfig.newHostConfig().withPortBindings(portBindings);
Map<String, String> labels = new HashMap<>(); Map<String, String> labels = new HashMap<>();
labels.put("test", "banquise"); labels.put("test", "banquise");
labels.put("environment", "development"); labels.put("environment", "development");
@ -180,32 +182,30 @@ public class DockerService {
labels.put("created-by", "java-docker-api"); labels.put("created-by", "java-docker-api");
dockerClient.buildImageCmd() dockerClient.buildImageCmd()
.withDockerfile(new File("./dockerfile/Dockerfile")) .withDockerfile(new File("./dockerfile/Dockerfile"))
.withBaseDirectory(new File("./dockerfile")) .withBaseDirectory(new File("./dockerfile"))
.withTags(Set.of("ji-python:latest")) .withTags(Set.of("ji-python:latest"))
.exec(new BuildImageResultCallback()) .exec(new BuildImageResultCallback())
.awaitImageId(); .awaitImageId();
CreateContainerResponse container = CreateContainerResponse container = dockerClient.createContainerCmd("ji-python:latest")
dockerClient.createContainerCmd("ji-python:latest")
.withName(name) .withName(name)
.withLabels(labels) .withLabels(labels)
.withExposedPorts(tcpSsh) .withExposedPorts(tcpSsh)
.withHostConfig(hostConfig) .withHostConfig(hostConfig)
.withEnv( .withEnv(
"SUDO_ACCESS=false", "SUDO_ACCESS=false",
"PASSWORD_ACCESS=true", "PASSWORD_ACCESS=true",
"USER_NAME=test", // TODO: CHANGE THIS "USER_NAME=test", // TODO: CHANGE THIS
"USER_PASSWORD=test" // AND this also oc "USER_PASSWORD=test" // AND this also oc
) )
.exec(); .exec();
return container.getId(); return container.getId();
} }
public InspectContainerResponse.ContainerState getStatusContainer(String name) { public InspectContainerResponse.ContainerState getStatusContainer(String name) {
InspectContainerResponse container = InspectContainerResponse container = dockerClient.inspectContainerCmd(name).exec();
dockerClient.inspectContainerCmd(name).exec();
return container.getState(); return container.getState();
} }
@ -235,11 +235,21 @@ public class DockerService {
dockerClient.stopContainerCmd(containerId).exec(); dockerClient.stopContainerCmd(containerId).exec();
} }
public List<Container> listAllContainers() { public List<DockerResponse> listAllContainers() {
return dockerClient.listContainersCmd() List<Container> containers = dockerClient.listContainersCmd()
.withShowAll(true) .withShowAll(true)
.exec(); .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);
}
} }