diff --git a/pom.xml b/pom.xml index 1492269..9fdd9e2 100644 --- a/pom.xml +++ b/pom.xml @@ -79,6 +79,11 @@ rest-assured test + + io.quarkiverse.docker + quarkus-docker-client + 0.0.5 + org.projectlombok lombok diff --git a/src/main/java/fr/la_banquise/backend/rest/ContainerResource.java b/src/main/java/fr/la_banquise/backend/rest/ContainerResource.java new file mode 100644 index 0000000..a16e287 --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/rest/ContainerResource.java @@ -0,0 +1,40 @@ +package fr.la_banquise.backend.rest; + +import fr.la_banquise.backend.services.DockerService; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; + +import java.util.Map; + +@Path("/containers") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class ContainerResource { + + @Inject + DockerService dockerService; + + @POST + @Path("/nginx") + public Response launchNginx() { + try { + String id = dockerService.createAndStartNginx(); + return Response.ok(Map.of("containerId", id, "status", "running")).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } + + @DELETE + @Path("/{id}") + public Response remove(@PathParam("id") String id) { + try { + dockerService.stopAndRemove(id); + return Response.ok(Map.of("containerId", id, "status", "removed")).build(); + } catch (Exception e) { + return Response.status(500).entity(Map.of("error", e.getMessage())).build(); + } + } +} \ No newline at end of file diff --git a/src/main/java/fr/la_banquise/backend/services/DockerService.java b/src/main/java/fr/la_banquise/backend/services/DockerService.java new file mode 100644 index 0000000..add12d4 --- /dev/null +++ b/src/main/java/fr/la_banquise/backend/services/DockerService.java @@ -0,0 +1,41 @@ +package fr.la_banquise.backend.services; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +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; + +@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); + + CreateContainerResponse container = dockerClient.createContainerCmd("nginx:latest") + .withName("my-nginx") + .withExposedPorts(tcp80) + .withHostConfig(hostConfig) + .exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + return container.getId(); + } + + public void stopAndRemove(String containerId) { + dockerClient.stopContainerCmd(containerId).exec(); + dockerClient.removeContainerCmd(containerId).exec(); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e95de2b..e7fb8cc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -36,3 +36,5 @@ quarkus.hibernate-orm.database.generation=update quarkus.quinoa.dev-server.port=5173 quarkus.quinoa.enable-spa-routing=true + +quarkus.docker.docker-host=unix:///var/run/docker.sock