diff --git a/.envrc b/.envrc index 3e6a147e52b..15a71adfaa8 100644 --- a/.envrc +++ b/.envrc @@ -1 +1,2 @@ use python 3.6.0 +use java 1.8 diff --git a/core/build.gradle b/core/build.gradle index 8c36aba5893..2efb4492dec 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -95,7 +95,7 @@ dependencies { exclude(group: "net.java.dev.jna") } - shaded ('com.github.docker-java:docker-java:3.1.0-rc-4') { + shaded ('com.github.docker-java:docker-java:3.1.1') { exclude(group: 'org.glassfish.jersey.core') exclude(group: 'org.glassfish.jersey.connectors') exclude(group: 'log4j') diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java index 725f04ca6d1..c183420d81a 100644 --- a/core/src/main/java/org/testcontainers/DockerClientFactory.java +++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java @@ -48,8 +48,8 @@ public class DockerClientFactory { public static final String SESSION_ID = UUID.randomUUID().toString(); public static final Map DEFAULT_LABELS = ImmutableMap.of( - TESTCONTAINERS_LABEL, "true", - TESTCONTAINERS_SESSION_ID_LABEL, SESSION_ID + TESTCONTAINERS_LABEL, "true", + TESTCONTAINERS_SESSION_ID_LABEL, SESSION_ID ); private static final String TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyImage(); @@ -89,7 +89,6 @@ public synchronized static DockerClientFactory instance() { } /** - * * @return a new initialized Docker client */ @Synchronized @@ -100,7 +99,7 @@ public DockerClient client() { } List configurationStrategies = new ArrayList(); - ServiceLoader.load(DockerClientProviderStrategy.class).forEach( cs -> configurationStrategies.add( cs ) ); + ServiceLoader.load(DockerClientProviderStrategy.class).forEach(cs -> configurationStrategies.add(cs)); strategy = DockerClientProviderStrategy.getFirstValidStrategy(configurationStrategies); @@ -114,10 +113,10 @@ public DockerClient client() { activeApiVersion = version.getApiVersion(); activeExecutionDriver = dockerInfo.getExecutionDriver(); log.info("Connected to docker: \n" + - " Server Version: " + dockerInfo.getServerVersion() + "\n" + - " API Version: " + activeApiVersion + "\n" + - " Operating System: " + dockerInfo.getOperatingSystem() + "\n" + - " Total Memory: " + dockerInfo.getMemTotal() / (1024 * 1024) + " MB"); + " Server Version: " + dockerInfo.getServerVersion() + "\n" + + " API Version: " + activeApiVersion + "\n" + + " Operating System: " + dockerInfo.getOperatingSystem() + "\n" + + " Total Memory: " + dockerInfo.getMemTotal() / (1024 * 1024) + " MB"); boolean checksEnabled = !TestcontainersConfiguration.getInstance().isDisableChecks(); @@ -157,9 +156,9 @@ private void checkDiskSpace(DockerClient dockerClient, String id) { try { dockerClient - .execStartCmd(dockerClient.execCreateCmd(id).withAttachStdout(true).withCmd("df", "-P").exec().getId()) - .exec(new ExecStartResultCallback(outputStream, null)) - .awaitCompletion(); + .execStartCmd(dockerClient.execCreateCmd(id).withAttachStdout(true).withCmd("df", "-P").exec().getId()) + .exec(new ExecStartResultCallback(outputStream, null)) + .awaitCompletion(); } catch (Exception e) { log.debug("Can't exec disk checking command", e); } @@ -167,8 +166,8 @@ private void checkDiskSpace(DockerClient dockerClient, String id) { DiskSpaceUsage df = parseAvailableDiskSpace(outputStream.toString()); VisibleAssertions.assertTrue( - "Docker environment should have more than 2GB free disk space", - df.availableMB.map(it -> it >= 2048).orElse(true) + "Docker environment should have more than 2GB free disk space", + df.availableMB.map(it -> it >= 2048).orElse(true) ); } @@ -180,7 +179,9 @@ private boolean checkMountableFile() { Volume volume = new Volume("/dummy"); try { return runInsideDocker( - createContainerCmd -> createContainerCmd.withBinds(new Bind(mountableFile.getResolvedPath(), volume, AccessMode.ro)), + createContainerCmd -> createContainerCmd.withHostConfig( + new HostConfig() + .withBinds(new Bind(mountableFile.getResolvedPath(), volume, AccessMode.ro))), (__, containerId) -> { try (InputStream stream = dockerClient.copyArchiveFromContainerCmd(containerId, volume.getPath()).exec()) { stream.read(); @@ -197,8 +198,8 @@ private boolean checkMountableFile() { } /** - * Check whether the image is available locally and pull it otherwise - */ + * Check whether the image is available locally and pull it otherwise + */ public void checkAndPullImage(DockerClient client, String image) { List images = client.listImagesCmd().withImageNameFilter(image).exec(); if (images.isEmpty()) { @@ -224,7 +225,7 @@ public T runInsideDocker(Consumer createContainerCmdCons private T runInsideDocker(DockerClient client, Consumer createContainerCmdConsumer, BiFunction block) { checkAndPullImage(client, TINY_IMAGE); CreateContainerCmd createContainerCmd = client.createContainerCmd(TINY_IMAGE) - .withLabels(DEFAULT_LABELS); + .withLabels(DEFAULT_LABELS); createContainerCmdConsumer.accept(createContainerCmd); String id = createContainerCmd.exec().getId(); diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index abf535869da..20c4bc8023c 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -233,7 +233,7 @@ private void tryStart() { containerId = createCommand.exec().getId(); - connectToPortForwardingNetwork(createCommand.getNetworkMode()); + connectToPortForwardingNetwork(createCommand.getHostConfig().getNetworkMode()); copyToFileContainerPathMap.forEach(this::copyFileToContainer); @@ -290,6 +290,7 @@ private void tryStart() { /** * Set any custom settings for the create command such as shared memory size. */ + @NotNull private HostConfig buildHostConfig() { HostConfig config = new HostConfig(); if (shmSize != null) { @@ -432,7 +433,7 @@ private void applyConfiguration(CreateContainerCmd createCommand) { .map(PortBinding::parse) .toArray(PortBinding[]::new); - createCommand.withPortBindings(portBindingArray); + hostConfig.withPortBindings(portBindingArray); if (commandParts != null) { createCommand.withCmd(commandParts); @@ -454,13 +455,11 @@ private void applyConfiguration(CreateContainerCmd createCommand) { } } - Bind[] bindsArray = binds.stream() - .toArray(Bind[]::new); - createCommand.withBinds(bindsArray); + Bind[] bindsArray = binds.toArray(new Bind[0]); + hostConfig.withBinds(bindsArray); - VolumesFrom[] volumesFromsArray = volumesFroms.stream() - .toArray(VolumesFrom[]::new); - createCommand.withVolumesFrom(volumesFromsArray); + VolumesFrom[] volumesFromsArray = volumesFroms.toArray(new VolumesFrom[0]); + hostConfig.withVolumesFrom(volumesFromsArray); Set allLinks = new HashSet<>(); Set allLinkedContainerNetworks = new HashSet<>(); @@ -482,7 +481,7 @@ private void applyConfiguration(CreateContainerCmd createCommand) { allLinkedContainerNetworks.addAll(linkedContainerNetworks); } - createCommand.withLinks(allLinks.toArray(new Link[allLinks.size()])); + hostConfig.withLinks(allLinks.toArray(new Link[0])); allLinkedContainerNetworks.remove("bridge"); if (allLinkedContainerNetworks.size() > 1) { @@ -494,24 +493,23 @@ private void applyConfiguration(CreateContainerCmd createCommand) { Optional networkForLinks = allLinkedContainerNetworks.stream().findFirst(); if (networkForLinks.isPresent()) { logger().debug("Associating container with network: {}", networkForLinks.get()); - createCommand.withNetworkMode(networkForLinks.get()); + hostConfig.withNetworkMode(networkForLinks.get()); } - createCommand.withPublishAllPorts(true); + hostConfig.withPublishAllPorts(true); PortForwardingContainer.INSTANCE.getNetwork().ifPresent(it -> { withExtraHost(INTERNAL_HOST_HOSTNAME, it.getIpAddress()); }); - String[] extraHostsArray = extraHosts.stream() - .toArray(String[]::new); - createCommand.withExtraHosts(extraHostsArray); + String[] extraHostsArray = extraHosts.toArray(new String[0]); + hostConfig.withExtraHosts(extraHostsArray); if (network != null) { - createCommand.withNetworkMode(network.getId()); + hostConfig.withNetworkMode(network.getId()); createCommand.withAliases(this.networkAliases); } else if (networkMode != null) { - createCommand.withNetworkMode(networkMode); + hostConfig.withNetworkMode(networkMode); } if (workingDirectory != null) { @@ -519,13 +517,12 @@ private void applyConfiguration(CreateContainerCmd createCommand) { } if (privilegedMode) { - createCommand.withPrivileged(privilegedMode); + hostConfig.withPrivileged(privilegedMode); } createContainerCmdModifiers.forEach(hook -> hook.accept(createCommand)); - Map combinedLabels = new HashMap<>(); - combinedLabels.putAll(labels); + Map combinedLabels = new HashMap<>(labels); if (createCommand.getLabels() != null) { combinedLabels.putAll(createCommand.getLabels()); } @@ -550,7 +547,6 @@ private Set findAllNetworksForLinkedContainers(LinkableContainer linkabl .filter(container -> container.getNetworkSettings() != null && container.getNetworkSettings().getNetworks() != null) .flatMap(container -> container.getNetworkSettings().getNetworks().keySet().stream()) - .distinct() .collect(Collectors.toSet()); } diff --git a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java index 717ba2635a8..b1396d01842 100644 --- a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java +++ b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java @@ -5,12 +5,7 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.InternalServerErrorException; import com.github.dockerjava.api.exception.NotFoundException; -import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.ExposedPort; -import com.github.dockerjava.api.model.HostConfig; -import com.github.dockerjava.api.model.Network; -import com.github.dockerjava.api.model.Ports; -import com.github.dockerjava.api.model.Volume; +import com.github.dockerjava.api.model.*; import com.google.common.annotations.VisibleForTesting; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -20,18 +15,10 @@ import org.slf4j.LoggerFactory; import org.testcontainers.DockerClientFactory; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; +import java.io.*; import java.net.Socket; import java.util.AbstractMap.SimpleEntry; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -69,17 +56,17 @@ public static String start(String hostIpAddress, DockerClient client) { String ryukImage = TestcontainersConfiguration.getInstance().getRyukImage(); DockerClientFactory.instance().checkAndPullImage(client, ryukImage); - List binds = new ArrayList<>(); - binds.add(new Bind("//var/run/docker.sock", new Volume("/var/run/docker.sock"))); + Binds binds = new Binds(new Bind("//var/run/docker.sock", new Volume("/var/run/docker.sock"))); String ryukContainerId = client.createContainerCmd(ryukImage) - .withHostConfig(new HostConfig().withAutoRemove(true)) + .withHostConfig(new HostConfig() + .withAutoRemove(true) + .withPublishAllPorts(true) + .withBinds(binds) + .withPrivileged(TestcontainersConfiguration.getInstance().isRyukPrivileged())) .withExposedPorts(new ExposedPort(8080)) - .withPublishAllPorts(true) .withName("testcontainers-ryuk-" + DockerClientFactory.SESSION_ID) .withLabels(Collections.singletonMap(DockerClientFactory.TESTCONTAINERS_LABEL, "true")) - .withBinds(binds) - .withPrivileged(TestcontainersConfiguration.getInstance().isRyukPrivileged()) .exec() .getId(); diff --git a/docs/examples/src/test/java/generic/CmdModifierTest.java b/docs/examples/src/test/java/generic/CmdModifierTest.java index 9f87a4da21c..a2604604931 100644 --- a/docs/examples/src/test/java/generic/CmdModifierTest.java +++ b/docs/examples/src/test/java/generic/CmdModifierTest.java @@ -1,5 +1,6 @@ package generic; +import com.github.dockerjava.api.model.HostConfig; import org.junit.Rule; import org.junit.Test; import org.testcontainers.containers.Container; @@ -20,8 +21,9 @@ public class CmdModifierTest { // memory { @Rule public GenericContainer memoryLimitedRedis = new GenericContainer<>("redis:3.0.2") - .withCreateContainerCmdModifier(cmd -> cmd.withMemory((long) 4 * 1024 * 1024)) - .withCreateContainerCmdModifier(cmd -> cmd.withMemorySwap((long) 4 * 1024 * 1024)); + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(HostConfig.newHostConfig() + .withMemory((long) 4 * 1024 * 1024) + .withMemorySwap((long) 4 * 1024 * 1024))); // } diff --git a/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java b/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java index 3f0f7684e82..696c1070345 100644 --- a/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java +++ b/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.vault; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.HostConfig; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.traits.LinkableContainer; @@ -41,7 +42,7 @@ public VaultContainer(String dockerImageName) { @Override protected void configure() { setStartupAttempts(3); - withCreateContainerCmdModifier(cmd -> cmd.withCapAdd(IPC_LOCK)); + withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withCapAdd(IPC_LOCK))); if(!isVaultPortRequested()){ withEnv("VAULT_ADDR", "http://0.0.0.0:" + VAULT_PORT); } @@ -130,4 +131,4 @@ private void setVaultPortRequested(boolean vaultPortRequested) { private boolean isVaultPortRequested() { return vaultPortRequested; } -} \ No newline at end of file +}