package net.libertacasa.pubsh.web; import java.io.File; import java.nio.file.Path; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.springframework.core.io.ClassPathResource; 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.InspectExecResponse.Container; import com.github.dockerjava.api.command.ListContainersCmd; import com.github.dockerjava.api.command.ListImagesCmd; import com.github.dockerjava.api.command.WaitContainerResultCallback; import com.github.dockerjava.api.model.Image; import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.core.DockerClientImpl; import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; import com.github.dockerjava.transport.DockerHttpClient; public class Docker { static DockerClientConfig DockerConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() .withDockerHost("tcp://sweetsuse:2375") .withDockerTlsVerify(false) .build(); static DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder() .dockerHost(DockerConfig.getDockerHost()) .sslConfig(DockerConfig.getSSLConfig()) .maxConnections(100) .connectionTimeout(Duration.ofSeconds(30)) .responseTimeout(Duration.ofSeconds(45)) .build(); static DockerClient dockerClient = DockerClientImpl.getInstance(DockerConfig, httpClient); public static List getImageChecksums() { List imageQuery; List imageList; imageQuery = dockerClient.listImagesCmd().exec(); imageList = imageQuery.stream().map(Image::getId).collect(Collectors.toList()); return imageList; } public static List getImages() { List imageQuery; imageQuery = dockerClient.listImagesCmd().exec(); return imageQuery; } public static List getContainers() { List containerQuery; containerQuery = dockerClient.listContainersCmd().withShowAll(true).exec(); return containerQuery; } public static void deleteContainer(String id) { Collection stringifiedId = Arrays.asList(id); System.out.println(id); System.out.println(stringifiedId); List containerQuery = dockerClient.listContainersCmd().withShowAll(false).withIdFilter(stringifiedId).exec(); //apparently listContainersCmd returns a bunch of garbled crap, hence the less ideal toString/contains if(! containerQuery.toString().contains(id)) { System.out.println("Not found in running containers ..."); List containerQueryAll = dockerClient.listContainersCmd().withShowAll(true).withIdFilter(stringifiedId).exec(); if(containerQueryAll.toString().contains(id)) { System.out.println("Found in stopped containers ..."); } if(! containerQueryAll.toString().contains(id)) { System.out.println("Not found at all. The fuck."); } } if(containerQuery.toString().contains(id)) { System.out.println("Found in running containers, stopping ..."); dockerClient.stopContainerCmd(id).exec(); } //System.out.println(containerQuery); dockerClient.removeContainerCmd(id).exec(); } public static String buildImage(String targetUser, String osChoice, Integer count) { String dockerfile = "/home/georg/tmp/docker/Dockerfile_" + osChoice; String tag = targetUser + ":sh" + count; if (! new File(dockerfile).exists()) { System.out.printf("\nInvalid Dockerfile: %s\n", dockerfile); } Set tags = new HashSet(); tags.add(tag); String imgid = dockerClient.buildImageCmd() .withDockerfile(new File(dockerfile)) .withPull(false).withNoCache(false).withTags(tags) .exec(new BuildImageResultCallback()).awaitImageId(); System.out.printf("\nBuilt image with ID %s", imgid); return(imgid); } public static void deleteImage(String username, String id) { List imagequery = Docker.getImages(); if (imagequery.toString().contains(id)) { System.out.printf("\nFound image ID %s, deleting ...", id); dockerClient.removeImageCmd(id).withImageId(id).exec(); } if (! imagequery.toString().contains(id)) { System.out.printf("\nImage ID %s not found.", id); } } public static String createContainer(String imgid) { //String containerid = dockerClient.createContainerCmd(imgid).exec(); WaitContainerResultCallback resultCallback = new WaitContainerResultCallback(); CreateContainerResponse createContainerResponse = dockerClient.createContainerCmd(imgid).exec(); dockerClient.waitContainerCmd(createContainerResponse.getId()).exec(resultCallback); try { resultCallback.awaitCompletion(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } String containerid = createContainerResponse.getId(); //System.out.println(dockerClient.infoCmd().exec()); System.out.printf("\nCreated container with ID %s from image ID %s", containerid, imgid); return(containerid); } }