From a1243d6493ed6c367c232edff23d9ea68e56ae40 Mon Sep 17 00:00:00 2001 From: belugabehr <12578579+belugabehr@users.noreply.github.com> Date: Mon, 19 Jun 2023 10:49:44 -0400 Subject: [PATCH 001/137] Use anchor instead of building toString() for debug logging (#2035) --- .../github/dockerjava/api/command/BuildImageResultCallback.java | 2 +- .../com/github/dockerjava/api/command/LoadImageCallback.java | 2 +- .../github/dockerjava/api/command/PullImageResultCallback.java | 2 +- .../dockerjava/api/command/WaitContainerResultCallback.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java index 0bb0f0884..331f69509 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java @@ -31,7 +31,7 @@ public void onNext(BuildResponseItem item) { } else if (item.isErrorIndicated()) { this.error = item.getError(); } - LOGGER.debug(item.toString()); + LOGGER.debug("{}", item); } /** diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java index 741598465..80cca18de 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java @@ -22,7 +22,7 @@ public void onNext(LoadResponseItem item) { this.error = item.getError(); } - LOGGER.debug(item.toString()); + LOGGER.debug("{}", item); } public String awaitMessage() { diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java index a4e9e9f9b..5980ce3df 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/PullImageResultCallback.java @@ -41,7 +41,7 @@ public void onNext(PullResponseItem item) { handleDockerClientResponse(item); } - LOGGER.debug(item.toString()); + LOGGER.debug("{}", item); } private void checkForDockerSwarmResponse(PullResponseItem item) { diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java index b4a6d3cc6..6cb160151 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerResultCallback.java @@ -27,7 +27,7 @@ public class WaitContainerResultCallback extends ResultCallbackTemplate Date: Mon, 19 Jun 2023 11:18:07 -0400 Subject: [PATCH 002/137] Handle repoNames with tags (#2128) Fixes #2127 --- .../github/dockerjava/core/NameParser.java | 12 ++++++ .../dockerjava/core/NameParserTest.java | 43 ++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java b/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java index ae39029ed..f06adb6d8 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/NameParser.java @@ -22,6 +22,7 @@ private NameParser() { private static final int RepositoryNameTotalLengthMax = 255; private static final String SHA256_SEPARATOR = "@sha256:"; + private static final String COLON_SEPARATOR = ":"; private static final Pattern RepositoryNameComponentRegexp = Pattern.compile("[a-z0-9]+(?:[._-][a-z0-9]+)*"); @@ -106,6 +107,13 @@ public static HostnameReposName resolveRepositoryName(String reposName) { String[] nameParts = reposName.split("/", 2); if (nameParts.length == 1 || (!nameParts[0].contains(".") && !nameParts[0].contains(":") && !nameParts[0].equals("localhost"))) { + if (StringUtils.containsIgnoreCase(reposName, SHA256_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, SHA256_SEPARATOR); + } + + if (StringUtils.contains(reposName, COLON_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, COLON_SEPARATOR); + } return new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, reposName); } @@ -119,6 +127,10 @@ public static HostnameReposName resolveRepositoryName(String reposName) { reposName = StringUtils.substringBeforeLast(reposName, SHA256_SEPARATOR); } + if (StringUtils.contains(reposName, COLON_SEPARATOR)) { + reposName = StringUtils.substringBeforeLast(reposName, COLON_SEPARATOR); + } + validateRepoName(reposName); return new HostnameReposName(hostname, reposName); } diff --git a/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java b/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java index c6332ba4b..89ad131f6 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/NameParserTest.java @@ -83,6 +83,24 @@ public void testResolveSimpleRepositoryName() { assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); } + @Test + public void testResolveRepositoryNameWithTag() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository:tag"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + + @Test + public void testResolveRepositoryNameWithSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository@sha256:sha256"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + + @Test + public void testResolveRepositoryNameWithTagAndSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("repository:tag@sha256:sha256"); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "repository"), resolved); + } + @Test public void testResolveRepositoryNameWithNamespace() { HostnameReposName resolved = NameParser.resolveRepositoryName("namespace/repository"); @@ -92,7 +110,7 @@ public void testResolveRepositoryNameWithNamespace() { @Test public void testResolveRepositoryNameWithNamespaceAndSHA256() { HostnameReposName resolved = NameParser.resolveRepositoryName("namespace/repository@sha256:sha256"); - assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository@sha256:sha256"), resolved); + assertEquals(new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, "namespace/repository"), resolved); } @Test @@ -107,6 +125,17 @@ public void testResolveRepositoryNameWithNamespaceAndHostnameAndSHA256() { assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); } + @Test + public void testResolveRepositoryNameWithNamespaceAndHostnameAndTag() { + HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository:tag"); + assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); + } + @Test + public void testResolveRepositoryNameWithNamespaceAndHostnameAndTagAndSHA256() { + HostnameReposName resolved = NameParser.resolveRepositoryName("localhost:5000/namespace/repository:tag@sha256:sha256"); + assertEquals(new HostnameReposName("localhost:5000", "namespace/repository"), resolved); + } + @Test(expected = InvalidRepositoryNameException.class) public void testResolveRepositoryNameWithIndex() { NameParser.resolveRepositoryName("index.docker.io/repository"); @@ -147,4 +176,16 @@ public void testResolveReposTagWithSHA256() { resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository@sha256:sha256"); assertEquals(new ReposTag("localhost:5000/namespace/repository@sha256:sha256", ""), resolved); } + + @Test + public void testResolveReposTagWithTagAndSHA256() { + ReposTag resolved = NameParser.parseRepositoryTag("repository:tag@sha256:sha256"); + assertEquals(new ReposTag("repository:tag@sha256:sha256", ""), resolved); + + resolved = NameParser.parseRepositoryTag("namespace/repository:tag@sha256:sha256"); + assertEquals(new ReposTag("namespace/repository:tag@sha256:sha256", ""), resolved); + + resolved = NameParser.parseRepositoryTag("localhost:5000/namespace/repository:tag@sha256:sha256"); + assertEquals(new ReposTag("localhost:5000/namespace/repository:tag@sha256:sha256", ""), resolved); + } } From 95f65e2a7a6feefa2704c3c39cccbaf8841dfc88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wielgo=C5=82aski?= Date: Fri, 7 Jul 2023 01:50:18 +0200 Subject: [PATCH 003/137] Fix support TLS configuration from docker context (#2130) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez --- .../core/DefaultDockerClientConfig.java | 15 +++++++-------- .../core/DockerContextMetaFile.java | 19 ++++++++++--------- .../core/DefaultDockerClientConfigTest.java | 3 +-- .../docker/ca.pem | 0 .../docker/cert.pem | 0 .../docker/key.pem | 0 6 files changed, 18 insertions(+), 19 deletions(-) create mode 100644 docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/ca.pem create mode 100644 docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/cert.pem create mode 100644 docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/key.pem diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java index 8a1f6193a..8011a2a5e 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java @@ -446,6 +446,9 @@ private void applyContextConfiguration(final String context) { Optional.ofNullable(context) .flatMap(ctx -> DockerContextMetaFile.resolveContextMetaFile(DockerClientConfig.getDefaultObjectMapper(), new File(this.dockerConfig), ctx)); + final Optional dockerContextTLSFile = + Optional.ofNullable(context) + .flatMap(ctx -> DockerContextMetaFile.resolveContextTLSFile(new File(this.dockerConfig), ctx)); if (dockerContextMetaFile.isPresent()) { final Optional dockerEndpoint = @@ -453,14 +456,10 @@ private void applyContextConfiguration(final String context) { if (this.dockerHost == null) { this.dockerHost = dockerEndpoint.map(endpoint -> endpoint.host).map(URI::create).orElse(null); } - if (this.dockerCertPath == null) { - this.dockerCertPath = dockerContextMetaFile.map(metaFile -> metaFile.storage) - .map(storage -> storage.tlsPath) - .filter(file -> new File(file).exists()).orElse(null); - if (this.dockerCertPath != null) { - this.dockerTlsVerify = dockerEndpoint.map(endpoint -> !endpoint.skipTLSVerify).orElse(true); - } - } + } + if (dockerContextTLSFile.isPresent() && this.dockerCertPath == null) { + this.dockerCertPath = dockerContextTLSFile.get().getAbsolutePath(); + this.dockerTlsVerify = true; } } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerContextMetaFile.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerContextMetaFile.java index d74c4949f..e10db4498 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerContextMetaFile.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerContextMetaFile.java @@ -18,8 +18,6 @@ public class DockerContextMetaFile { @JsonProperty("Endpoints") Endpoints endpoints; - @JsonProperty("Storage") - Storage storage; public static class Endpoints { @JsonProperty("docker") @@ -34,13 +32,6 @@ public static class Docker { } } - public static class Storage { - - @JsonProperty("TLSPath") - String tlsPath; - @JsonProperty("MetadataPath") - String metadataPath; - } public static Optional resolveContextMetaFile(ObjectMapper objectMapper, File dockerConfigPath, String context) { final File path = dockerConfigPath.toPath() @@ -52,6 +43,16 @@ public static Optional resolveContextMetaFile(ObjectMappe return Optional.ofNullable(loadContextMetaFile(objectMapper, path)); } + public static Optional resolveContextTLSFile(File dockerConfigPath, String context) { + final File path = dockerConfigPath.toPath() + .resolve("contexts") + .resolve("tls") + .resolve(metaHashFunction.hashString(context, StandardCharsets.UTF_8).toString()) + .resolve("docker") + .toFile(); + return Optional.ofNullable(path).filter(File::exists); + } + public static DockerContextMetaFile loadContextMetaFile(ObjectMapper objectMapper, File dockerContextMetaFile) { try { return parseContextMetaFile(objectMapper, dockerContextMetaFile); diff --git a/docker-java/src/test/java/com/github/dockerjava/core/DefaultDockerClientConfigTest.java b/docker-java/src/test/java/com/github/dockerjava/core/DefaultDockerClientConfigTest.java index 7e03a9159..6c7787caf 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/DefaultDockerClientConfigTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/DefaultDockerClientConfigTest.java @@ -129,8 +129,7 @@ public void dockerContextWithDockerHostAndTLS() { assertEquals(URI.create("tcp://remote:2376"), config.getDockerHost()); assertTrue("SSL config is set", config.getSSLConfig() instanceof LocalDirectorySSLConfig); - assertEquals("target/test-classes/com/github/dockerjava/core/util/CertificateUtilsTest/allFilesExist", - ((LocalDirectorySSLConfig)config.getSSLConfig()).getDockerCertPath()); + assertTrue("SSL directory is set", ((LocalDirectorySSLConfig)config.getSSLConfig()).getDockerCertPath().endsWith("dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker")); } @Test diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/ca.pem b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/ca.pem new file mode 100644 index 000000000..e69de29bb diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/cert.pem b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/cert.pem new file mode 100644 index 000000000..e69de29bb diff --git a/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/key.pem b/docker-java/src/test/resources/dockerContextHomeDir/.docker/contexts/tls/b71199ebd070b36beab7317920c2c2f1d777df8d05e5527d8458fda57cb17a7a/docker/key.pem new file mode 100644 index 000000000..e69de29bb From 33f510ac95785aeef1e3a9ffbd013c36bd2ea37a Mon Sep 17 00:00:00 2001 From: Julian <33688601+cmdjulian@users.noreply.github.com> Date: Fri, 7 Jul 2023 03:04:39 +0200 Subject: [PATCH 004/137] Update bouncy castle to bcpkix-jdk18on:1.75 (#2135) --- docker-java-core/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-java-core/pom.xml b/docker-java-core/pom.xml index cec97d25d..b8369fa37 100644 --- a/docker-java-core/pom.xml +++ b/docker-java-core/pom.xml @@ -69,7 +69,7 @@ org.bouncycastle - bcpkix-jdk15on + bcpkix-jdk18on ${bouncycastle.version} diff --git a/pom.xml b/pom.xml index fe1e6d472..532ea0c4a 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 3.12.0 1.7.30 - 1.64 + 1.75 2.6.1 19.0 From 78472c912cd0a239ea48a971fd9ef0a25cb4d55e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 7 Jul 2023 23:33:21 -0600 Subject: [PATCH 005/137] Ad ddependency-submission action (#2139) --- .github/workflows/dependency-submission.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/dependency-submission.yml diff --git a/.github/workflows/dependency-submission.yml b/.github/workflows/dependency-submission.yml new file mode 100644 index 000000000..ac365b973 --- /dev/null +++ b/.github/workflows/dependency-submission.yml @@ -0,0 +1,19 @@ +name: Dependency Submission + +on: + push: + branches: + - main + +jobs: + dependency_submission: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK + uses: actions/setup-java@v3 + with: + java-version: 8 + distribution: temurin + - name: Submit Dependency Snapshot + uses: advanced-security/maven-dependency-submission-action@v3 From ca8b8598297df5b62feb02f88e748abf02fb3610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 7 Jul 2023 23:35:42 -0600 Subject: [PATCH 006/137] Revert "Ad ddependency-submission action (#2139)" This reverts commit 78472c912cd0a239ea48a971fd9ef0a25cb4d55e. --- .github/workflows/dependency-submission.yml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 .github/workflows/dependency-submission.yml diff --git a/.github/workflows/dependency-submission.yml b/.github/workflows/dependency-submission.yml deleted file mode 100644 index ac365b973..000000000 --- a/.github/workflows/dependency-submission.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Dependency Submission - -on: - push: - branches: - - main - -jobs: - dependency_submission: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK - uses: actions/setup-java@v3 - with: - java-version: 8 - distribution: temurin - - name: Submit Dependency Snapshot - uses: advanced-security/maven-dependency-submission-action@v3 From e92c30e403da5d9a1f9be7f9c1250f609d36c82c Mon Sep 17 00:00:00 2001 From: chunweilim <117911826+chunweilim@users.noreply.github.com> Date: Mon, 31 Jul 2023 09:26:49 +1000 Subject: [PATCH 007/137] Prevent auths field in config.json to be null (#2142) Fixes #2138 --- .../com/github/dockerjava/core/DockerConfigFile.java | 8 +++++++- .../com/github/dockerjava/core/DockerConfigFileTest.java | 6 ++++++ .../testAuthConfigFile/validJsonAuthsNull/config.json | 9 +++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 docker-java/src/test/resources/testAuthConfigFile/validJsonAuthsNull/config.json diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerConfigFile.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerConfigFile.java index 825796a74..39ef15271 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerConfigFile.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerConfigFile.java @@ -1,6 +1,7 @@ package com.github.dockerjava.core; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.model.AuthConfig; @@ -28,7 +29,7 @@ public class DockerConfigFile { }; @JsonProperty - private final Map auths; + private Map auths; @JsonProperty private String currentContext; @@ -46,6 +47,11 @@ public Map getAuths() { return auths; } + @JsonSetter + public void setAuths(Map authConfigMap) { + auths = (authConfigMap == null || authConfigMap.size() == 0) ? new HashMap<>() : authConfigMap; + } + void addAuthConfig(AuthConfig config) { auths.put(config.getRegistryAddress(), config); } diff --git a/docker-java/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java b/docker-java/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java index ce1a59cc0..76211fc55 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/DockerConfigFileTest.java @@ -164,6 +164,12 @@ public void nonExistent() throws IOException { assertThat(runTest("idontexist"), is(expected)); } + @Test + public void validJsonAuthsNull() throws IOException { + DockerConfigFile expected = new DockerConfigFile(); + assertThat(runTest("validJsonAuthsNull"), is(expected)); + } + private DockerConfigFile runTest(String testFileName) throws IOException { return DockerConfigFile.loadConfig(JSONTestHelper.getMapper(), new File(FILESROOT, testFileName).getAbsolutePath()); } diff --git a/docker-java/src/test/resources/testAuthConfigFile/validJsonAuthsNull/config.json b/docker-java/src/test/resources/testAuthConfigFile/validJsonAuthsNull/config.json new file mode 100644 index 000000000..d104c357c --- /dev/null +++ b/docker-java/src/test/resources/testAuthConfigFile/validJsonAuthsNull/config.json @@ -0,0 +1,9 @@ +{ + "auths": null, + "credsStore": "desktop", + "plugins": { + "-x-cli-hints": { + "enabled": "true" + } + } +} From aa13c7fdcc9804ad039a582a456d69488f616ba2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:08:35 -0600 Subject: [PATCH 008/137] Bump org.bouncycastle:bcpkix-jdk18on from 1.75 to 1.76 (#2169) Bumps [org.bouncycastle:bcpkix-jdk18on](https://github.com/bcgit/bc-java) from 1.75 to 1.76. - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) --- updated-dependencies: - dependency-name: org.bouncycastle:bcpkix-jdk18on dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 532ea0c4a..536f069b7 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 3.12.0 1.7.30 - 1.75 + 1.76 2.6.1 19.0 From f5455eaf5bd3c2e58842d5459a74efa675954896 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:08:47 -0600 Subject: [PATCH 009/137] Bump org.junit.jupiter:junit-jupiter from 5.7.2 to 5.10.0 (#2163) Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.7.2 to 5.10.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.2...r5.10.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index dca404bc1..f49e7723f 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -50,7 +50,7 @@ org.junit.jupiter junit-jupiter - 5.7.2 + 5.10.0 test From 5d03c4c8f060fb1d05eca20593ed93dfa696e384 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:10:26 -0600 Subject: [PATCH 010/137] Bump commons-io from 2.6 to 2.13.0 (#2153) Bumps commons-io from 2.6 to 2.13.0. --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 536f069b7..1538bb3a5 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 2.10.3 4.5.12 1.21 - 2.6 + 2.13.0 3.12.0 1.7.30 From 2babed862d9820921962e66dad14e5dab8741901 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:11:57 -0600 Subject: [PATCH 011/137] Bump jna from 5.12.1 to 5.13.0 (#2047) Bumps [jna](https://github.com/java-native-access/jna) from 5.12.1 to 5.13.0. - [Release notes](https://github.com/java-native-access/jna/releases) - [Changelog](https://github.com/java-native-access/jna/blob/master/CHANGES.md) - [Commits](https://github.com/java-native-access/jna/compare/5.12.1...5.13.0) --- updated-dependencies: - dependency-name: net.java.dev.jna:jna dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-httpclient5/pom.xml | 2 +- docker-java-transport-okhttp/pom.xml | 2 +- docker-java-transport/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 5800fb994..4eb9f41df 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -41,7 +41,7 @@ net.java.dev.jna jna - 5.12.1 + 5.13.0 diff --git a/docker-java-transport-okhttp/pom.xml b/docker-java-transport-okhttp/pom.xml index 351005461..df14ad077 100644 --- a/docker-java-transport-okhttp/pom.xml +++ b/docker-java-transport-okhttp/pom.xml @@ -35,7 +35,7 @@ net.java.dev.jna jna - 5.12.1 + 5.13.0 diff --git a/docker-java-transport/pom.xml b/docker-java-transport/pom.xml index 633053c39..2ca377dd6 100644 --- a/docker-java-transport/pom.xml +++ b/docker-java-transport/pom.xml @@ -37,7 +37,7 @@ net.java.dev.jna jna - 5.12.1 + 5.13.0 provided From 12ecc2bcbf0b6fbfe64cc658101ebccd6a1d06d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:12:14 -0600 Subject: [PATCH 012/137] Bump assertj-core from 3.22.0 to 3.24.2 (#2051) Bumps assertj-core from 3.22.0 to 3.24.2. --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 9ad692c1f..491b42bc9 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -34,7 +34,7 @@ org.assertj assertj-core - 3.22.0 + 3.24.2 From 1da9515043f1ca290c6779a65a21a74f11fad2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 26 Oct 2023 11:56:02 -0600 Subject: [PATCH 013/137] Disable CopyArchiveToContainerCmdIT#copyFileWithUIDGID (#2228) See https://github.com/moby/moby/issues/46388 --- .../com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java index bbd98932f..efce65c29 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CopyArchiveToContainerCmdIT.java @@ -6,6 +6,7 @@ import com.github.dockerjava.core.util.CompressArchiveUtil; import com.github.dockerjava.utils.LogContainerTestCallback; import org.apache.commons.io.FileUtils; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -148,6 +149,7 @@ public void copyFileWithExecutePermission() throws Exception { assertThat(exitCode, equalTo(0)); } + @Ignore("Docker issue https://github.com/moby/moby/issues/46388") @Test public void copyFileWithUIDGID() throws Exception { Path with = Files.createFile(Files.createTempDirectory("copyFileWithUIDGID").resolve("uidgid.with")); From ede20db9870476fe51a8b376a36921d99177d3bf Mon Sep 17 00:00:00 2001 From: Maksim Dimukhametov Date: Thu, 26 Oct 2023 22:11:01 +0200 Subject: [PATCH 014/137] Fixing flaky test `ListContainersCmdIT.testStatusFilter` (#2188) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../dockerjava/cmd/ListContainersCmdIT.java | 62 ++++++++++++------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java index a94a02f82..c03df2a55 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.TimeUnit; import static ch.lambdaj.Lambda.filter; import static com.github.dockerjava.api.model.HostConfig.newHostConfig; @@ -188,16 +189,8 @@ public void testIdsFilter() { } @Test - public void testStatusFilter() { - String id1, id2; - id1 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withCmd("sh", "-c", "sleep 99999") - .withLabels(testLabel) - .exec() - .getId(); - - id2 = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) - .withCmd("sh", "-c", "sleep 99999") + public void shouldFilterByCreatedStatus() { + String containerId = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withLabels(testLabel) .exec() .getId(); @@ -208,42 +201,67 @@ public void testStatusFilter() { .withStatusFilter(singletonList("created")) .exec(); - assertThat(filteredContainers.size(), is(2)); - assertThat(filteredContainers.get(1).getId(), isOneOf(id1, id2)); + assertThat(filteredContainers.size(), is(1)); + assertThat(filteredContainers.get(0).getId(), is(containerId)); + } - dockerRule.getClient().startContainerCmd(id1).exec(); + @Test + public void shouldFilterByRunningStatus() { + String containerId = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withLabels(testLabel) + .exec() + .getId(); + dockerRule.getClient().startContainerCmd(containerId).exec(); - filteredContainers = dockerRule.getClient().listContainersCmd() + List filteredContainers = dockerRule.getClient().listContainersCmd() .withShowAll(true) .withLabelFilter(testLabel) .withStatusFilter(singletonList("running")) .exec(); assertThat(filteredContainers.size(), is(1)); - assertThat(filteredContainers.get(0).getId(), is(id1)); + assertThat(filteredContainers.get(0).getId(), is(containerId)); + } - dockerRule.getClient().pauseContainerCmd(id1).exec(); + @Test + public void shouldFilterByPausedStatus() { + String containerId = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withCmd("sh", "-c", "sleep 99999") + .withLabels(testLabel) + .exec() + .getId(); + dockerRule.getClient().startContainerCmd(containerId).exec(); + dockerRule.getClient().pauseContainerCmd(containerId).exec(); - filteredContainers = dockerRule.getClient().listContainersCmd() + List filteredContainers = dockerRule.getClient().listContainersCmd() .withShowAll(true) .withLabelFilter(testLabel) .withStatusFilter(singletonList("paused")) .exec(); assertThat(filteredContainers.size(), is(1)); - assertThat(filteredContainers.get(0).getId(), is(id1)); + assertThat(filteredContainers.get(0).getId(), is(containerId)); + } - dockerRule.getClient().unpauseContainerCmd(id1).exec(); - dockerRule.getClient().stopContainerCmd(id1).exec(); + @Test + public void shouldFilterByExitedStatus() throws InterruptedException { + String containerId = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withCmd("sh", "-c", "sleep 99999") + .withLabels(testLabel) + .exec() + .getId(); + dockerRule.getClient().startContainerCmd(containerId).exec(); + dockerRule.getClient().stopContainerCmd(containerId).exec(); + dockerRule.getClient().waitContainerCmd(containerId).start().awaitCompletion(15, TimeUnit.SECONDS); - filteredContainers = dockerRule.getClient().listContainersCmd() + List filteredContainers = dockerRule.getClient().listContainersCmd() .withShowAll(true) .withLabelFilter(testLabel) .withStatusFilter(singletonList("exited")) .exec(); assertThat(filteredContainers.size(), is(1)); - assertThat(filteredContainers.get(0).getId(), is(id1)); + assertThat(filteredContainers.get(0).getId(), is(containerId)); } @Test From d138d51999cde27ff89fbe5b070045a37203192f Mon Sep 17 00:00:00 2001 From: Sietse Ludger Geertsema Date: Thu, 26 Oct 2023 22:25:06 +0200 Subject: [PATCH 015/137] Add units (nanoseconds) to HealthCheck (#2187) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../com/github/dockerjava/api/model/HealthCheck.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java index 24873a74f..6c8d425e1 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java @@ -63,11 +63,19 @@ public Long getTimeout() { return timeout; } + /** + * Set interval in nanoseconds + * @return this {@link HealthCheck} instance + */ public HealthCheck withInterval(Long interval) { this.interval = interval; return this; } + /** + * Set timeout in nanoseconds + * @return this {@link HealthCheck} instance + */ public HealthCheck withTimeout(Long timeout) { this.timeout = timeout; return this; @@ -95,6 +103,10 @@ public Long getStartPeriod() { return startPeriod; } + /** + * Set startPeriod in nanoseconds + * @return this {@link HealthCheck} instance + */ public HealthCheck withStartPeriod(Long startPeriod) { this.startPeriod = startPeriod; return this; From fea93ec68ac29e8befeab3c85922283406ea15e2 Mon Sep 17 00:00:00 2001 From: Lars <60571459+LarsSven@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:30:49 +0200 Subject: [PATCH 016/137] Implemented the `SizeRw` field in the `InspectContainerResponse` class. (#2216) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../dockerjava/api/command/InspectContainerResponse.java | 7 +++++++ .../com/github/dockerjava/cmd/InspectContainerCmdIT.java | 2 ++ .../api/command/inspectContainerResponse_full_1_26a.json | 1 + .../resources/samples/1.22/containers/json/filter1.json | 1 + 4 files changed, 11 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index 05492c51f..94207fd2c 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -63,6 +63,9 @@ public class InspectContainerResponse extends DockerObject { @JsonProperty("SizeRootFs") private Integer sizeRootFs; + @JsonProperty("SizeRw") + private Integer sizeRw; + @JsonProperty("Image") private String imageId; @@ -125,6 +128,10 @@ public Integer getSizeRootFs() { return sizeRootFs; } + public Integer getSizeRw() { + return sizeRw; + } + public String getCreated() { return created; } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java index fed85df73..54d900db8 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java @@ -101,6 +101,8 @@ public void inspectContainerWithSize() throws DockerException { if (isNotSwarm(dockerRule.getClient())) { assertNotNull(containerInfo.getSizeRootFs()); assertTrue(containerInfo.getSizeRootFs().intValue() > 0); + assertNotNull(containerInfo.getSizeRw()); + assertTrue(containerInfo.getSizeRw().intValue() == 0); } } diff --git a/docker-java/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json b/docker-java/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json index 2f3428d7a..688ea2689 100644 --- a/docker-java/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json +++ b/docker-java/src/test/resources/com/github/dockerjava/api/command/inspectContainerResponse_full_1_26a.json @@ -6,6 +6,7 @@ "postgres" ], "SizeRootFs" : null, + "SizeRw" : null, "HostConfig" : { "KernelMemory" : 0, "MemorySwappiness" : -1, diff --git a/docker-java/src/test/resources/samples/1.22/containers/json/filter1.json b/docker-java/src/test/resources/samples/1.22/containers/json/filter1.json index 159e62da6..51329bb63 100644 --- a/docker-java/src/test/resources/samples/1.22/containers/json/filter1.json +++ b/docker-java/src/test/resources/samples/1.22/containers/json/filter1.json @@ -10,6 +10,7 @@ "Created": 1455662451, "Ports": [], "SizeRootFs": 1113554, + "SizeRw": 0, "Labels": {}, "Status": "Up Less than a second", "HostConfig": { From a437d0e0670069c40518ea9fe730f709c121f031 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 19:24:38 -0600 Subject: [PATCH 017/137] Bump com.github.siom79.japicmp:japicmp-maven-plugin (#2226) Bumps [com.github.siom79.japicmp:japicmp-maven-plugin](https://github.com/siom79/japicmp) from 0.15.4 to 0.18.2. - [Release notes](https://github.com/siom79/japicmp/releases) - [Changelog](https://github.com/siom79/japicmp/blob/master/release.py) - [Commits](https://github.com/siom79/japicmp/compare/japicmp-base-0.15.4...japicmp-base-0.18.2) --- updated-dependencies: - dependency-name: com.github.siom79.japicmp:japicmp-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1538bb3a5..327612045 100644 --- a/pom.xml +++ b/pom.xml @@ -243,7 +243,7 @@ com.github.siom79.japicmp japicmp-maven-plugin - 0.15.4 + 0.18.2 From 8a840511ad9417d71e8293ba04310fb92d5e87eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 19:24:54 -0600 Subject: [PATCH 018/137] Bump org.testcontainers:testcontainers from 1.16.3 to 1.19.1 (#2218) Bumps [org.testcontainers:testcontainers](https://github.com/testcontainers/testcontainers-java) from 1.16.3 to 1.19.1. - [Release notes](https://github.com/testcontainers/testcontainers-java/releases) - [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.16.3...1.19.1) --- updated-dependencies: - dependency-name: org.testcontainers:testcontainers dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 491b42bc9..2e4bd79ce 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -46,7 +46,7 @@ org.testcontainers testcontainers - 1.16.3 + 1.19.1 From 278a3ac6428ae88b652d7e2dab2db12354af4f3f Mon Sep 17 00:00:00 2001 From: Clayton Walker Date: Fri, 27 Oct 2023 12:58:03 -0600 Subject: [PATCH 019/137] Replace deprecated match methods (#2189) --- .../dockerjava/cmd/ListContainersCmdIT.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java index c03df2a55..30667671f 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java @@ -26,11 +26,12 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.emptyString; -import static org.hamcrest.Matchers.isOneOf; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.oneOf; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertEquals; import static org.testinfected.hamcrest.jpa.PersistenceMatchers.hasField; @@ -161,8 +162,8 @@ public void testNameFilter() { .exec(); assertThat(filteredContainers.size(), is(2)); - assertThat(filteredContainers.get(0).getId(), isOneOf(id1, id2)); - assertThat(filteredContainers.get(1).getId(), isOneOf(id1, id2)); + assertThat(filteredContainers.get(0).getId(), is(oneOf(id1, id2))); + assertThat(filteredContainers.get(1).getId(), is(oneOf(id1, id2))); } @Test @@ -184,8 +185,8 @@ public void testIdsFilter() { .exec(); assertThat(filteredContainers.size(), is(2)); - assertThat(filteredContainers.get(0).getId(), isOneOf(id1, id2)); - assertThat(filteredContainers.get(1).getId(), isOneOf(id1, id2)); + assertThat(filteredContainers.get(0).getId(), is(oneOf(id1, id2))); + assertThat(filteredContainers.get(1).getId(), is(oneOf(id1, id2))); } @Test @@ -219,7 +220,7 @@ public void shouldFilterByRunningStatus() { .withStatusFilter(singletonList("running")) .exec(); - assertThat(filteredContainers.size(), is(1)); + assertThat(filteredContainers, hasSize(1)); assertThat(filteredContainers.get(0).getId(), is(containerId)); } @@ -239,7 +240,7 @@ public void shouldFilterByPausedStatus() { .withStatusFilter(singletonList("paused")) .exec(); - assertThat(filteredContainers.size(), is(1)); + assertThat(filteredContainers, hasSize(1)); assertThat(filteredContainers.get(0).getId(), is(containerId)); } @@ -260,7 +261,7 @@ public void shouldFilterByExitedStatus() throws InterruptedException { .withStatusFilter(singletonList("exited")) .exec(); - assertThat(filteredContainers.size(), is(1)); + assertThat(filteredContainers, hasSize(1)); assertThat(filteredContainers.get(0).getId(), is(containerId)); } @@ -289,7 +290,7 @@ public void testVolumeFilter() { .withVolumeFilter(singletonList("TestFilterVolume")) .exec(); - assertThat(filteredContainers.size(), is(1)); + assertThat(filteredContainers, hasSize(1)); assertThat(filteredContainers.get(0).getId(), is(id)); } From fd5da167a4cd437e51b7fcda1a6ab63a31c59185 Mon Sep 17 00:00:00 2001 From: Maksim Dimukhametov Date: Fri, 27 Oct 2023 23:49:35 +0200 Subject: [PATCH 020/137] Add signal query argument for Restart Container command (#2186) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../api/command/RestartContainerCmd.java | 16 ++++--- .../dockerjava/core/RemoteApiVersion.java | 2 + .../core/command/RestartContainerCmdImpl.java | 28 +++++++++--- .../core/exec/RestartContainerCmdExec.java | 4 ++ .../cmd/RestartContainerCmdImplIT.java | 43 ++++++++++++++++++- 5 files changed, 82 insertions(+), 11 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java index 5f60f1125..372456813 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/RestartContainerCmd.java @@ -8,9 +8,8 @@ /** * Restart a running container. * - * @param timeout - * - Timeout in seconds before killing the container. Defaults to 10 seconds. - * + * @param signal - Signal to send to the container as an integer or string (e.g. SIGINT). + * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. */ public interface RestartContainerCmd extends SyncDockerCmd { @@ -20,6 +19,12 @@ public interface RestartContainerCmd extends SyncDockerCmd { @CheckForNull Integer getTimeout(); + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_42} + */ + @CheckForNull + String getSignal(); + RestartContainerCmd withContainerId(@Nonnull String containerId); /** @@ -32,9 +37,10 @@ default RestartContainerCmd withtTimeout(Integer timeout) { RestartContainerCmd withTimeout(Integer timeout); + RestartContainerCmd withSignal(String signal); + /** - * @throws NotFoundException - * No such container + * @throws NotFoundException No such container */ @Override Void exec() throws NotFoundException; diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index a38930cb3..57b15b240 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -91,6 +91,8 @@ public class RemoteApiVersion implements Serializable { public static final RemoteApiVersion VERSION_1_37 = RemoteApiVersion.create(1, 37); public static final RemoteApiVersion VERSION_1_38 = RemoteApiVersion.create(1, 38); public static final RemoteApiVersion VERSION_1_40 = RemoteApiVersion.create(1, 40); + public static final RemoteApiVersion VERSION_1_41 = RemoteApiVersion.create(1, 41); + public static final RemoteApiVersion VERSION_1_42 = RemoteApiVersion.create(1, 42); /** diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java index 03454d6a8..3b1df465b 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/RestartContainerCmdImpl.java @@ -7,12 +7,13 @@ import com.github.dockerjava.api.command.RestartContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; +import javax.annotation.CheckForNull; + /** * Restart a running container. * - * @param timeout - * - Timeout in seconds before killing the container. Defaults to 10 seconds. - * + * @param signal - Signal to send to the container as an integer or string (e.g. SIGINT). + * @param timeout - Timeout in seconds before killing the container. Defaults to 10 seconds. */ public class RestartContainerCmdImpl extends AbstrDockerCmd implements RestartContainerCmd { @@ -20,6 +21,8 @@ public class RestartContainerCmdImpl extends AbstrDockerCmd= 1.42", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_42)); + + DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withApiVersion(RemoteApiVersion.VERSION_1_42) + .withRegistryUrl("https://index.docker.io/v1/") + .build(); + try (DockerClient dockerClient = createDockerClient(dockerClientConfig)) { + String expectedUserSignal = "10"; + String initialCommandWithTrap = "trap 'echo \"exit trapped\"' %s; sleep 9999;"; + final String containerId = dockerClient + .createContainerCmd(DEFAULT_IMAGE) + .withCmd( + "/bin/sh", + "-c", + String.format(initialCommandWithTrap, expectedUserSignal)) + .exec() + .getId(); + assertThat(containerId, not(is(emptyString()))); + dockerClient.startContainerCmd(containerId).exec(); + + // Restart container without signal + dockerClient.restartContainerCmd(containerId).exec(); + String log = dockerRule.containerLog(containerId); + assertThat(log.trim(), emptyString()); + + dockerClient.restartContainerCmd(containerId).withSignal(expectedUserSignal).exec(); + log = dockerRule.containerLog(containerId); + assertThat(log.trim(), is("exit trapped")); + + dockerClient.removeContainerCmd(containerId).withForce(true).withRemoveVolumes(true).exec(); + } + } + @Test(expected = NotFoundException.class) public void restartNonExistingContainer() throws DockerException { From 84d7750d7f290c66f0ae18c88ab92a3cde2c804d Mon Sep 17 00:00:00 2001 From: Lars <60571459+LarsSven@users.noreply.github.com> Date: Tue, 19 Dec 2023 23:57:02 +0100 Subject: [PATCH 021/137] Use long rather than int for sizeRw and sizeRootFs (#2230) Fixes #2237 --- .../dockerjava/api/command/InspectContainerResponse.java | 8 ++++---- .../com/github/dockerjava/cmd/InspectContainerCmdIT.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index 94207fd2c..f06bd4ed9 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -61,10 +61,10 @@ public class InspectContainerResponse extends DockerObject { private String id; @JsonProperty("SizeRootFs") - private Integer sizeRootFs; + private Long sizeRootFs; @JsonProperty("SizeRw") - private Integer sizeRw; + private Long sizeRw; @JsonProperty("Image") private String imageId; @@ -124,11 +124,11 @@ public String getId() { return id; } - public Integer getSizeRootFs() { + public Long getSizeRootFs() { return sizeRootFs; } - public Integer getSizeRw() { + public Long getSizeRw() { return sizeRw; } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java index 54d900db8..22ccd577b 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java @@ -100,9 +100,9 @@ public void inspectContainerWithSize() throws DockerException { // TODO check swarm if (isNotSwarm(dockerRule.getClient())) { assertNotNull(containerInfo.getSizeRootFs()); - assertTrue(containerInfo.getSizeRootFs().intValue() > 0); + assertTrue(containerInfo.getSizeRootFs().longValue() > 0L); assertNotNull(containerInfo.getSizeRw()); - assertTrue(containerInfo.getSizeRw().intValue() == 0); + assertTrue(containerInfo.getSizeRw().longValue() == 0L); } } From b56497a01b50aaacb73cb34aa8de9f2d2fb0f780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 1 Feb 2024 19:02:17 -0500 Subject: [PATCH 022/137] Ignore LogSwarmObjectIT#testLogsCmd (#2280) --- .../java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java index ddaf86fb6..11606dce0 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/LogSwarmObjectIT.java @@ -12,6 +12,7 @@ import com.github.dockerjava.api.model.TaskSpec; import com.github.dockerjava.api.model.TaskState; import com.github.dockerjava.utils.LogContainerTestCallback; +import org.junit.Ignore; import org.junit.Test; import java.io.IOException; @@ -25,6 +26,8 @@ import static org.hamcrest.core.Is.is; public class LogSwarmObjectIT extends SwarmCmdIT { + + @Ignore @Test public void testLogsCmd() throws InterruptedException, IOException { DockerClient dockerClient = startSwarm(); From 1c6fcdbce655bc60c5fe291465809934b1b4ac76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 1 Feb 2024 19:11:34 -0500 Subject: [PATCH 023/137] Enable japicmp in docker-java-api module (#2279) * Enable japicmp in docker-java-api * Revert "Use long rather than int for sizeRw and sizeRootFs (#2230)" This reverts commit 84d7750d7f290c66f0ae18c88ab92a3cde2c804d. --- docker-java-api/pom.xml | 4 ++++ .../dockerjava/api/command/InspectContainerResponse.java | 8 ++++---- .../com/github/dockerjava/cmd/InspectContainerCmdIT.java | 4 ++-- pom.xml | 4 ++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index f49e7723f..da19bba47 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -81,6 +81,10 @@ + + com.github.siom79.japicmp + japicmp-maven-plugin + diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index f06bd4ed9..94207fd2c 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -61,10 +61,10 @@ public class InspectContainerResponse extends DockerObject { private String id; @JsonProperty("SizeRootFs") - private Long sizeRootFs; + private Integer sizeRootFs; @JsonProperty("SizeRw") - private Long sizeRw; + private Integer sizeRw; @JsonProperty("Image") private String imageId; @@ -124,11 +124,11 @@ public String getId() { return id; } - public Long getSizeRootFs() { + public Integer getSizeRootFs() { return sizeRootFs; } - public Long getSizeRw() { + public Integer getSizeRw() { return sizeRw; } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java index 22ccd577b..54d900db8 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java @@ -100,9 +100,9 @@ public void inspectContainerWithSize() throws DockerException { // TODO check swarm if (isNotSwarm(dockerRule.getClient())) { assertNotNull(containerInfo.getSizeRootFs()); - assertTrue(containerInfo.getSizeRootFs().longValue() > 0L); + assertTrue(containerInfo.getSizeRootFs().intValue() > 0); assertNotNull(containerInfo.getSizeRw()); - assertTrue(containerInfo.getSizeRw().longValue() == 0L); + assertTrue(containerInfo.getSizeRw().intValue() == 0); } } diff --git a/pom.xml b/pom.xml index 327612045..3ada79555 100644 --- a/pom.xml +++ b/pom.xml @@ -243,13 +243,13 @@ com.github.siom79.japicmp japicmp-maven-plugin - 0.18.2 + 0.18.3 com.github.docker-java ${project.artifactId} - 3.2.0 + 3.3.4 jar From 7957a142809184817483aaebd2eb03398f0e6394 Mon Sep 17 00:00:00 2001 From: Henri Tremblay Date: Thu, 1 Feb 2024 19:12:11 -0500 Subject: [PATCH 024/137] Add StartInterval to health check since it will be supported by the 1.44 docker API (#2244) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez --- .gitignore | 1 + .../dockerjava/api/model/HealthCheck.java | 19 ++++ .../dockerjava/core/RemoteApiVersion.java | 2 + .../github/dockerjava/cmd/HealthCmdIT.java | 88 +++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java diff --git a/.gitignore b/.gitignore index 201acaa5f..006641e8c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ # Ignore all build/dist directories target +dependency-reduced-pom.xml # Ignore InteliJ Idea project files .idea/ diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java index 6c8d425e1..0e41b873f 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HealthCheck.java @@ -55,6 +55,12 @@ public class HealthCheck extends DockerObject implements Serializable { @JsonProperty("StartPeriod") private Long startPeriod; + /** + * @since 1.44 + */ + @JsonProperty("StartInterval") + private Long startInterval; + public Long getInterval() { return interval; } @@ -111,4 +117,17 @@ public HealthCheck withStartPeriod(Long startPeriod) { this.startPeriod = startPeriod; return this; } + + public Long getStartInterval() { + return startInterval; + } + + /** + * Set startInterval in nanoseconds + * @return this {@link HealthCheck} instance + */ + public HealthCheck withStartInterval(Long startInterval) { + this.startInterval = startInterval; + return this; + } } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java b/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java index 57b15b240..373a67332 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/RemoteApiVersion.java @@ -93,6 +93,8 @@ public class RemoteApiVersion implements Serializable { public static final RemoteApiVersion VERSION_1_40 = RemoteApiVersion.create(1, 40); public static final RemoteApiVersion VERSION_1_41 = RemoteApiVersion.create(1, 41); public static final RemoteApiVersion VERSION_1_42 = RemoteApiVersion.create(1, 42); + public static final RemoteApiVersion VERSION_1_43 = RemoteApiVersion.create(1, 43); + public static final RemoteApiVersion VERSION_1_44 = RemoteApiVersion.create(1, 44); /** diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java new file mode 100644 index 000000000..bdca27572 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/HealthCmdIT.java @@ -0,0 +1,88 @@ +package com.github.dockerjava.cmd; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.HealthStateLog; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.HealthCheck; +import com.github.dockerjava.core.RemoteApiVersion; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; +import static org.awaitility.Awaitility.await; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.emptyString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.junit.Assume.assumeThat; + +public class HealthCmdIT extends CmdIT { + private final Logger LOG = LoggerFactory.getLogger(HealthCmdIT.class); + + @Test + public void healthiness() { + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("nc", "-l", "-p", "8080") + .withHealthcheck(new HealthCheck() + .withTest(Arrays.asList("CMD", "sh", "-c", "netstat -ltn | grep 8080")) + .withInterval(TimeUnit.SECONDS.toNanos(1)) + .withTimeout(TimeUnit.MINUTES.toNanos(1)) + .withStartPeriod(TimeUnit.SECONDS.toNanos(30)) + .withRetries(10)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + await().atMost(60L, TimeUnit.SECONDS).untilAsserted( + () -> { + InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); + assertThat(inspectContainerResponse.getState().getHealth().getStatus(), is(equalTo("healthy"))); + } + ); + } + + @Test + public void healthiness_startInterval() { + assumeThat("API version should be >= 1.44", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_44)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("nc", "-l", "-p", "8080") + .withHealthcheck(new HealthCheck() + .withTest(Arrays.asList("CMD", "sh", "-c", "netstat -ltn | grep 8080")) + .withInterval(TimeUnit.SECONDS.toNanos(5)) + .withTimeout(TimeUnit.MINUTES.toNanos(1)) + .withStartPeriod(TimeUnit.SECONDS.toNanos(2)) + .withStartInterval(TimeUnit.SECONDS.toNanos(1)) + .withRetries(10)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + await().atMost(60L, TimeUnit.SECONDS).untilAsserted( + () -> { + InspectContainerResponse inspectContainerResponse = dockerRule.getClient().inspectContainerCmd(container.getId()).exec(); + List healthStateLogs = inspectContainerResponse.getState().getHealth().getLog(); + assertThat(healthStateLogs.size(), is(greaterThanOrEqualTo(2))); + healthStateLogs.forEach(log -> LOG.info("Health log: {}", log.getStart())); + HealthStateLog log1 = healthStateLogs.get(healthStateLogs.size() - 1); + HealthStateLog log2 = healthStateLogs.get(healthStateLogs.size() - 2); + long diff = ChronoUnit.NANOS.between(ZonedDateTime.parse(log2.getStart()), ZonedDateTime.parse(log1.getStart())); + assertThat(diff, is(greaterThanOrEqualTo(inspectContainerResponse.getConfig().getHealthcheck().getInterval()))); + } + ); + } + +} From 1bac81fa0afdae18d30bd62b1ba666375ee20147 Mon Sep 17 00:00:00 2001 From: Sylvere Richard Date: Fri, 2 Feb 2024 01:12:57 +0100 Subject: [PATCH 025/137] Add missing states in ServiceUpdateState (#2292) --- .../github/dockerjava/api/model/ServiceUpdateState.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ServiceUpdateState.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ServiceUpdateState.java index e748bbd4a..d22f8999e 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ServiceUpdateState.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ServiceUpdateState.java @@ -6,6 +6,9 @@ * @since {@link RemoteApiVersion#VERSION_1_24} */ public enum ServiceUpdateState { + @JsonProperty("unknown") + UNKNOWN, + @JsonProperty("updating") UPDATING, @@ -15,6 +18,12 @@ public enum ServiceUpdateState { @JsonProperty("completed") COMPLETED, + @JsonProperty("rollback_started") + ROLLBACK_STARTED, + + @JsonProperty("rollback_paused") + ROLLBACK_PAUSED, + @JsonProperty("rollback_completed") ROLLBACK_COMPLETED } From 129f7868a0463bad09f74dcfb26391b224be6784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 19 Feb 2024 12:54:35 -0500 Subject: [PATCH 026/137] Update actions/checkout and actions/setup-java version to v4 (#2309) --- .github/workflows/ci.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f1ef43de..dcfa853f2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,9 +17,9 @@ jobs: - { name: "Docker 19.03.9", dockerVersion: "5:19.03.9~3-0~ubuntu-focal", javaVersion: 8 } steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{matrix.javaVersion}} distribution: temurin diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ee128801..ec59b2603 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,9 +10,9 @@ jobs: build: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 8 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 8 distribution: temurin From 4d8c436d6cbe312be22b157c3ebdb6eb973140ae Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Mon, 26 Feb 2024 12:19:07 -0600 Subject: [PATCH 027/137] If BuildImage fails but logs something about success, don't succeed (#2305) This patch ensures that if the docker build commands result in logging the string "Successfully built", the callback from that build will still fail if there was an error in building. Fixes #2184 --- .../api/command/BuildImageResultCallback.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java index 331f69509..9db21a6c4 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java @@ -67,14 +67,14 @@ public String awaitImageId(long timeout, TimeUnit timeUnit) { } private String getImageId() { - if (imageId != null) { - return imageId; + if (error != null) { + throw new DockerClientException("Could not build image: " + error); } - if (error == null) { - throw new DockerClientException("Could not build image"); + if (imageId != null) { + return imageId; } - throw new DockerClientException("Could not build image: " + error); + throw new DockerClientException("Could not build image"); } } From 3514b3ba9c6d938e2a0435ad8d84905cb1cdfed1 Mon Sep 17 00:00:00 2001 From: Clayton Walker Date: Mon, 26 Feb 2024 12:08:02 -0700 Subject: [PATCH 028/137] Remove exclusion and fix httpclient5 compatibility (#2294) Fixes #2290 --- docker-java-transport-httpclient5/pom.xml | 6 ------ .../ApacheDockerHttpClientImpl.java | 19 +++++++++++++++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 4eb9f41df..48b751d56 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -30,12 +30,6 @@ org.apache.httpcomponents.client5 httpclient5 5.0.3 - - - org.apache.httpcomponents.core5 - httpcore5-h2 - - diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java index 93677bd36..4820c65e5 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java @@ -38,6 +38,7 @@ import javax.net.ssl.SSLContext; import java.io.IOException; import java.io.InputStream; +import java.net.InetSocketAddress; import java.net.Socket; import java.net.URI; import java.time.Duration; @@ -147,17 +148,31 @@ private Registry createConnectionSocketFactoryRegistry( return socketFactoryRegistryBuilder .register("tcp", PlainConnectionSocketFactory.INSTANCE) .register("http", PlainConnectionSocketFactory.INSTANCE) - .register("unix", new PlainConnectionSocketFactory() { + .register("unix", new ConnectionSocketFactory() { @Override public Socket createSocket(HttpContext context) throws IOException { return UnixSocket.get(dockerHost.getPath()); } + + @Override + public Socket connectSocket(TimeValue timeValue, Socket socket, HttpHost httpHost, InetSocketAddress inetSocketAddress, + InetSocketAddress inetSocketAddress1, HttpContext httpContext) throws IOException { + return PlainConnectionSocketFactory.INSTANCE.connectSocket(timeValue, socket, httpHost, inetSocketAddress, + inetSocketAddress1, httpContext); + } }) - .register("npipe", new PlainConnectionSocketFactory() { + .register("npipe", new ConnectionSocketFactory() { @Override public Socket createSocket(HttpContext context) { return new NamedPipeSocket(dockerHost.getPath()); } + + @Override + public Socket connectSocket(TimeValue timeValue, Socket socket, HttpHost httpHost, InetSocketAddress inetSocketAddress, + InetSocketAddress inetSocketAddress1, HttpContext httpContext) throws IOException { + return PlainConnectionSocketFactory.INSTANCE.connectSocket(timeValue, socket, httpHost, inetSocketAddress, + inetSocketAddress1, httpContext); + } }) .build(); } From 4f6c5937983ff4ae7cc82bead44afe3afee4d0ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 26 Feb 2024 14:11:30 -0500 Subject: [PATCH 029/137] Test against Java 21 (#2304) --- .github/workflows/ci.yml | 1 + docker-java-api/pom.xml | 2 +- docker-java/pom.xml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dcfa853f2..0335a352e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,7 @@ jobs: include: - { name: "default", javaVersion: 8 } - { name: "default", javaVersion: 17 } + - { name: "default", javaVersion: 21 } - { name: "over TCP", dockerHost: "tcp://127.0.0.1:2375", javaVersion: 8 } - { name: "Docker 19.03.9", dockerVersion: "5:19.03.9~3-0~ubuntu-focal", javaVersion: 8 } diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index da19bba47..82d176e38 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -42,7 +42,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.30 provided diff --git a/docker-java/pom.xml b/docker-java/pom.xml index 39e1b1b65..e3c3690f1 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -141,7 +141,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.30 provided From b29527510d9f7c16b30b138ae4a2f6703d88bb01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 26 Feb 2024 18:30:42 -0500 Subject: [PATCH 030/137] Add `Runtimes` to `Info` response (#2311) --- .../com/github/dockerjava/api/model/Info.java | 10 ++++++++ .../dockerjava/api/model/RuntimeInfo.java | 23 +++++++++++++++++++ .../com/github/dockerjava/cmd/InfoCmdIT.java | 1 + 3 files changed, 34 insertions(+) create mode 100644 docker-java-api/src/main/java/com/github/dockerjava/api/model/RuntimeInfo.java diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java index 0752778e3..c436e7391 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java @@ -235,6 +235,9 @@ public class Info extends DockerObject implements Serializable { @JsonProperty("SecurityOptions") private List securityOptions; + @JsonProperty("Runtimes") + private Map runtimes; + /** * @see #architecture */ @@ -1070,4 +1073,11 @@ public Info withIsolation(String isolation) { public List getSecurityOptions() { return securityOptions; } + + /** + * @see #runtimes + */ + public Map getRuntimes() { + return runtimes; + } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/RuntimeInfo.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/RuntimeInfo.java new file mode 100644 index 000000000..c64511cda --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/RuntimeInfo.java @@ -0,0 +1,23 @@ +package com.github.dockerjava.api.model; + +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; + +@EqualsAndHashCode +@ToString +public class RuntimeInfo extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + + private String path; + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + +} diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InfoCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InfoCmdIT.java index d7917326b..74fc2cbda 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InfoCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InfoCmdIT.java @@ -48,6 +48,7 @@ public void infoTest() throws DockerException { assertThat(dockerInfo.getImages(), notNullValue()); assertThat(dockerInfo.getImages(), greaterThan(0)); assertThat(dockerInfo.getDebug(), notNullValue()); + assertThat(dockerInfo.getRuntimes(), notNullValue()); if (isNotSwarm(dockerClient)) { assertThat(dockerInfo.getNFd(), greaterThan(0)); From f146f9696db7b4d4180d95677a879f8597d34ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 9 Jul 2024 11:39:37 -0600 Subject: [PATCH 031/137] Update images (#2346) --- .../java/com/github/dockerjava/cmd/ListContainersCmdIT.java | 4 ++-- .../test/java/com/github/dockerjava/cmd/PullImageCmdIT.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java index 30667671f..3490924c7 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ListContainersCmdIT.java @@ -330,11 +330,11 @@ public void testAncestorFilter() throws Exception { DockerAssume.assumeNotSwarm(dockerRule.getClient()); dockerRule.getClient().pullImageCmd("busybox") - .withTag("1.24") + .withTag("1.35") .start() .awaitCompletion(); - dockerRule.getClient().createContainerCmd("busybox:1.24") + dockerRule.getClient().createContainerCmd("busybox:1.35") .withLabels(testLabel) .exec(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/PullImageCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/PullImageCmdIT.java index 539a2b606..3b8dde3ff 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/PullImageCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/PullImageCmdIT.java @@ -45,7 +45,7 @@ public void testPullImage() throws Exception { // pulled down, preferably small in size. If tag is not used pull will // download all images in that repository but tmpImgs will only // deleted 'latest' image but not images with other tags - String testImage = "hackmann/empty"; + String testImage = "alpine:3.17"; LOG.info("Removing image: {}", testImage); From b28b0dc267bc3ab9feb5645957311e5fa42ce94e Mon Sep 17 00:00:00 2001 From: Niklas Gehlen Date: Tue, 9 Jul 2024 22:05:48 +0200 Subject: [PATCH 032/137] Consider already existing images as successful pull (#2335) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../com/github/dockerjava/api/model/PullResponseItem.java | 5 ++++- .../github/dockerjava/api/model/PullResponseItemTest.java | 8 ++++++++ .../dockerjava/api/model/PullResponseJSONSamples.java | 4 +++- .../api/model/pullImageResponse_alreadyExists.json | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 docker-java/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_alreadyExists.json diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java index 66a559934..1d3f33c8e 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/PullResponseItem.java @@ -19,6 +19,8 @@ public class PullResponseItem extends ResponseItem { private static final String DOWNLOADED_SWARM = ": downloaded"; + private static final String ALREADY_EXISTS = "Already exists"; + /** * Returns whether the status indicates a successful pull operation * @@ -34,7 +36,8 @@ public boolean isPullSuccessIndicated() { getStatus().contains(IMAGE_UP_TO_DATE) || getStatus().contains(DOWNLOADED_NEWER_IMAGE) || getStatus().contains(LEGACY_REGISTRY) || - getStatus().contains(DOWNLOADED_SWARM) + getStatus().contains(DOWNLOADED_SWARM) || + getStatus().contains(ALREADY_EXISTS) ); } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java index 486badd55..f73036864 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseItemTest.java @@ -29,6 +29,14 @@ * @author Zach Marshall */ public class PullResponseItemTest { + @Test + public void imageAlreadyExists() throws IOException { + PullResponseItem response = testRoundTrip(PullResponseJSONSamples.pullImageResponse_alreadyExists, + PullResponseItem.class); + assertTrue(response.isPullSuccessIndicated()); + assertFalse(response.isErrorIndicated()); + } + @Test public void pullNewerImage() throws IOException { PullResponseItem response = testRoundTrip(PullResponseJSONSamples.pullImageResponse_newerImage, diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java b/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java index 31cdf0f3b..4997a390a 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/PullResponseJSONSamples.java @@ -23,7 +23,9 @@ * @author Zach Marshall */ public enum PullResponseJSONSamples implements JSONResourceRef { - pullImageResponse_legacy, pullImageResponse_error, pullImageResponse_newerImage, pullImageResponse_upToDate; + pullImageResponse_legacy, pullImageResponse_error, + pullImageResponse_newerImage, pullImageResponse_upToDate, + pullImageResponse_alreadyExists; @Override public String getFileName() { diff --git a/docker-java/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_alreadyExists.json b/docker-java/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_alreadyExists.json new file mode 100644 index 000000000..ae318e29d --- /dev/null +++ b/docker-java/src/test/resources/com/github/dockerjava/api/model/pullImageResponse_alreadyExists.json @@ -0,0 +1 @@ +{"status":"Already exists"} From 242c76ae01aea5c965ee5f1037ba84bafb84015c Mon Sep 17 00:00:00 2001 From: Juan Manuel Olle Date: Tue, 9 Jul 2024 17:16:04 -0300 Subject: [PATCH 033/137] Add Network create attribute (#2344) --- .../java/com/github/dockerjava/api/model/Network.java | 8 ++++++++ .../com/github/dockerjava/cmd/CreateNetworkCmdIT.java | 3 +++ .../com/github/dockerjava/cmd/InspectNetworkCmdIT.java | 2 ++ 3 files changed, 13 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Network.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Network.java index 7e5110ce6..7e9d3b2fd 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Network.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Network.java @@ -7,6 +7,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Map; @@ -18,6 +19,9 @@ public class Network extends DockerObject implements Serializable { @JsonProperty("Id") private String id; + @JsonProperty("Created") + private Date created; + @JsonProperty("Name") private String name; @@ -52,6 +56,10 @@ public String getId() { return id; } + public Date getCreated() { + return created; + } + public String getName() { return name; } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateNetworkCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateNetworkCmdIT.java index deb8a4718..d60425a2a 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateNetworkCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateNetworkCmdIT.java @@ -15,9 +15,11 @@ import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeThat; @@ -37,6 +39,7 @@ public void createNetwork() throws DockerException { Network network = dockerRule.getClient().inspectNetworkCmd().withNetworkId(createNetworkResponse.getId()).exec(); assertThat(network.getName(), is(networkName)); assertThat(network.getDriver(), is("bridge")); + assertThat(network.getCreated().getTime(), greaterThan(0L)); } @Test diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectNetworkCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectNetworkCmdIT.java index eca86497d..035d3d767 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectNetworkCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectNetworkCmdIT.java @@ -10,6 +10,7 @@ import static com.github.dockerjava.utils.TestUtils.findNetwork; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; public class InspectNetworkCmdIT extends CmdIT { @@ -28,5 +29,6 @@ public void inspectNetwork() throws DockerException { assertThat(network.getDriver(), equalTo(expected.getDriver())); assertThat(network.getIpam().getConfig().get(0).getSubnet(), equalTo(expected.getIpam().getConfig().get(0).getSubnet())); assertThat(network.getIpam().getDriver(), equalTo(expected.getIpam().getDriver())); + assertThat(network.getCreated().getTime(), greaterThan(0L)); } } From f14cff90924f7aa5bf570ab49e6e91532ba8a362 Mon Sep 17 00:00:00 2001 From: Holger Stolzenberg Date: Wed, 10 Jul 2024 19:26:49 +0200 Subject: [PATCH 034/137] Add -parameters option for compilation of project (#2317) Fixes #2316 --- docker-java-core/pom.xml | 1 + pom.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/docker-java-core/pom.xml b/docker-java-core/pom.xml index b8369fa37..290a1fed9 100644 --- a/docker-java-core/pom.xml +++ b/docker-java-core/pom.xml @@ -99,6 +99,7 @@ 8 8 + true diff --git a/pom.xml b/pom.xml index 3ada79555..f58a3d448 100644 --- a/pom.xml +++ b/pom.xml @@ -148,6 +148,7 @@ ${jdk.target} ${jdk.debug} ${jdk.optimize} + true From a1393bf2e1265ba1e6eca4240af55396852f8a7c Mon Sep 17 00:00:00 2001 From: Torsten Krah Date: Thu, 11 Jul 2024 19:03:02 +0200 Subject: [PATCH 035/137] Enable protocol configuration of SSLContext (#2337) Fixes #2332 --- .../com/github/dockerjava/core/LocalDirectorySSLConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java b/docker-java-core/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java index 665f48f06..0f50f561d 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/LocalDirectorySSLConfig.java @@ -64,7 +64,8 @@ public SSLContext getSSLContext() { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(tmfAlgorithm); trustManagerFactory.init(CertificateUtils.createTrustStore(capem)); - SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); + SSLContext sslContext = SSLContext.getInstance(AccessController.doPrivileged(getSystemProperty("ssl.protocol", + "TLSv1.2"))); sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); return sslContext; From 818eedb754375e6705d9f2ec124f5b2ccdefa059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 10 Dec 2024 15:56:16 -0600 Subject: [PATCH 036/137] Rename main workflow to release-drafter --- .github/workflows/{main.yml => release-drafter.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{main.yml => release-drafter.yml} (100%) diff --git a/.github/workflows/main.yml b/.github/workflows/release-drafter.yml similarity index 100% rename from .github/workflows/main.yml rename to .github/workflows/release-drafter.yml From 996f206602bae64d9e2e3f31caf4c0d9ad656776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 10 Dec 2024 15:56:33 -0600 Subject: [PATCH 037/137] Allow to start workflow manually --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0335a352e..03cc0034d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,6 +3,7 @@ name: CI on: pull_request: {} push: { branches: [ main ] } + workflow_dispatch: jobs: build: From fc505c1f0f1de7c180e5ec9532ebf2b8585afe3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 10 Dec 2024 19:21:05 -0500 Subject: [PATCH 038/137] Fix restart test (#2375) --- .../com/github/dockerjava/cmd/RestartContainerCmdImplIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java index ac2415281..bdf309dc2 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java @@ -60,7 +60,7 @@ public void restartContainerWithSignal() throws Exception { .build(); try (DockerClient dockerClient = createDockerClient(dockerClientConfig)) { String expectedUserSignal = "10"; - String initialCommandWithTrap = "trap 'echo \"exit trapped\"' %s; sleep 9999;"; + String initialCommandWithTrap = "trap 'echo \"exit trapped\"' %s; while :; do sleep 1; done"; final String containerId = dockerClient .createContainerCmd(DEFAULT_IMAGE) .withCmd( From 61dc04260a67e134aa76777d7db5988e7647893f Mon Sep 17 00:00:00 2001 From: Lars <60571459+LarsSven@users.noreply.github.com> Date: Wed, 11 Dec 2024 01:30:51 +0100 Subject: [PATCH 039/137] Add support for CgroupVersion and CgroupDriver (#2360) --- .../com/github/dockerjava/api/model/Info.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java index c436e7391..75afefd2b 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java @@ -97,6 +97,12 @@ public class Info extends DockerObject implements Serializable { @JsonProperty("LoggingDriver") private String loggingDriver; + @JsonProperty("CgroupDriver") + private String cGroupDriver; + + @JsonProperty("CgroupVersion") + private String cGroupVersion; + /** * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_20} */ @@ -486,6 +492,22 @@ public String getLoggingDriver() { return loggingDriver; } + /** + * @see #cGroupDriver + */ + @CheckForNull + public String getCGroupDriver() { + return cGroupDriver; + } + + /** + * @see #cGroupVersion + */ + @CheckForNull + public String getCGroupVersion() { + return cGroupVersion; + } + /** * @see #loggingDriver */ @@ -494,6 +516,22 @@ public Info withLoggingDriver(String loggingDriver) { return this; } + /** + * @see #cGroupDriver + */ + public Info withCGroupDriver(String cGroupDriver) { + this.cGroupDriver = cGroupDriver; + return this; + } + + /** + * @see #cGroupVersion + */ + public Info withCGroupVersion(String cGroupVersion) { + this.cGroupVersion = cGroupVersion; + return this; + } + /** * @see #experimentalBuild */ From 721f09f4bf723de9d97ddc8d4a107928ceda50c6 Mon Sep 17 00:00:00 2001 From: Clayton Walker Date: Wed, 11 Dec 2024 12:02:20 -0700 Subject: [PATCH 040/137] Don't swallow IOException caused by opening socket (#2041) Add additional context to socket exception --- .../com/github/dockerjava/okhttp/UnixSocketFactory.java | 2 +- .../java/com/github/dockerjava/transport/UnixSocket.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java index dc19b1351..d25bcb3d3 100644 --- a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java +++ b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/UnixSocketFactory.java @@ -20,7 +20,7 @@ public Socket createSocket() { try { return UnixSocket.get(socketPath); } catch (IOException e) { - throw new RuntimeException(e); + throw new RuntimeException("Failed create socket with path " + socketPath, e); } } diff --git a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java index de447db61..eb7a49b51 100644 --- a/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java +++ b/docker-java-transport/src/main/java/com/github/dockerjava/transport/UnixSocket.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketException; @@ -24,7 +25,8 @@ public class UnixSocket extends AbstractSocket { public static Socket get(String path) throws IOException { try { return new UnixSocket(path); - } catch (Exception e) { + } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | + IllegalAccessException e) { //noinspection deprecation return DomainSocket.get(path); } @@ -34,7 +36,8 @@ public static Socket get(String path) throws IOException { private final SocketChannel socketChannel; - private UnixSocket(String path) throws Exception { + private UnixSocket(String path) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, + IllegalAccessException, IOException { Class unixDomainSocketAddress = Class.forName("java.net.UnixDomainSocketAddress"); this.socketAddress = (SocketAddress) unixDomainSocketAddress.getMethod("of", String.class) From 9f3d369bd6db48d99d8fc41109a8bca28cc604b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 11 Dec 2024 13:53:49 -0600 Subject: [PATCH 041/137] Set OSSRH credentials for release workflow --- .github/workflows/release.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ec59b2603..1517a1167 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,10 +16,15 @@ jobs: with: java-version: 8 distribution: temurin + server-id: default + server-username: MAVEN_USERNAME + server-password: MAVEN_CENTRAL_TOKEN - name: Set version run: ./mvnw versions:set -DnewVersion="${{github.event.release.tag_name}}" # TODO check main's CI status - name: Deploy with Maven env: MAVEN_DEPLOYMENT_REPOSITORY: ${{ secrets.MAVEN_DEPLOYMENT_REPOSITORY }} + MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} + MAVEN_CENTRAL_TOKEN: ${{ secrets.OSSRH_PASSWORD }} run: ./mvnw deploy -DaltReleaseDeploymentRepository="$MAVEN_DEPLOYMENT_REPOSITORY" -DskipTests From 93d1aae98fcee8bf3bcce4ed20b890c59841d0bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 16 Dec 2024 11:22:21 -0500 Subject: [PATCH 042/137] Switch to docker/setup-docker-action (#2374) --- .ci/get-docker-com.sh | 313 --------------------------------------- .ci/setup_docker.sh | 39 ----- .github/workflows/ci.yml | 37 +++-- 3 files changed, 27 insertions(+), 362 deletions(-) delete mode 100755 .ci/get-docker-com.sh delete mode 100755 .ci/setup_docker.sh diff --git a/.ci/get-docker-com.sh b/.ci/get-docker-com.sh deleted file mode 100755 index d9c0142a2..000000000 --- a/.ci/get-docker-com.sh +++ /dev/null @@ -1,313 +0,0 @@ -#!/bin/sh -set -e -# -# This script is meant for quick & easy install via: -# 'curl -sSL https://get.docker.com/ | sh' -# or: -# 'wget -qO- https://get.docker.com/ | sh' -# -# For test builds (ie. release candidates): -# 'curl -fsSL https://test.docker.com/ | sh' -# or: -# 'wget -qO- https://test.docker.com/ | sh' -# -# For experimental builds: -# 'curl -fsSL https://experimental.docker.com/ | sh' -# or: -# 'wget -qO- https://experimental.docker.com/ | sh' -# -# Docker Maintainers: -# To update this script on https://get.docker.com, -# use hack/release.sh during a normal release, -# or the following one-liner for script hotfixes: -# aws s3 cp --acl public-read hack/install.sh s3://get.docker.com/index -# - -url="https://get.docker.com/" -apt_url="https://apt.dockerproject.org" -yum_url="https://yum.dockerproject.org" -gpg_fingerprint="58118E89F3A912897C070ADBF76221572C52609D" - -key_servers=" -ha.pool.sks-keyservers.net -pgp.mit.edu -keyserver.ubuntu.com -" - -command_exists() { - command -v "$@" > /dev/null 2>&1 -} - -semverParse() { - major="${1%%.*}" - minor="${1#$major.}" - minor="${minor%%.*}" - patch="${1#$major.$minor.}" - patch="${patch%%[-.]*}" -} - -do_install() { - case "$(uname -m)" in - *64) - ;; - *) - cat >&2 <<-'EOF' - Error: you are not using a 64bit platform. - Docker currently only supports 64bit platforms. - EOF - exit 1 - ;; - esac - - user="$(id -un 2>/dev/null || true)" - - sh_c='sh -c' - if [ "$user" != 'root' ]; then - if command_exists sudo; then - sh_c='sudo -E sh -c' - elif command_exists su; then - sh_c='su -c' - else - cat >&2 <<-'EOF' - Error: this installer needs the ability to run commands as root. - We are unable to find either "sudo" or "su" available to make this happen. - EOF - exit 1 - fi - fi - - curl='' - if command_exists curl; then - curl='curl -sSL' - elif command_exists wget; then - curl='wget -qO-' - elif command_exists busybox && busybox --list-modules | grep -q wget; then - curl='busybox wget -qO-' - fi - - # check to see which repo they are trying to install from - if [ -z "$repo" ]; then - repo='main' - if [ "https://test.docker.com/" = "$url" ]; then - repo='testing' - elif [ "https://experimental.docker.com/" = "$url" ]; then - repo='experimental' - fi - fi - - # perform some very rudimentary platform detection - lsb_dist='' - dist_version='' - if command_exists lsb_release; then - lsb_dist="$(lsb_release -si)" - fi - if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then - lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")" - fi - if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then - lsb_dist='debian' - fi - if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then - lsb_dist='fedora' - fi - if [ -z "$lsb_dist" ] && [ -r /etc/oracle-release ]; then - lsb_dist='oracleserver' - fi - if [ -z "$lsb_dist" ]; then - if [ -r /etc/centos-release ] || [ -r /etc/redhat-release ]; then - lsb_dist='centos' - fi - fi - if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then - lsb_dist="$(. /etc/os-release && echo "$ID")" - fi - - lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')" - - case "$lsb_dist" in - - ubuntu) - if command_exists lsb_release; then - dist_version="$(lsb_release --codename | cut -f2)" - fi - if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then - dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")" - fi - ;; - - debian) - dist_version="$(cat /etc/debian_version | sed 's/\/.*//' | sed 's/\..*//')" - case "$dist_version" in - 8) - dist_version="jessie" - ;; - 7) - dist_version="wheezy" - ;; - esac - ;; - - oracleserver) - # need to switch lsb_dist to match yum repo URL - lsb_dist="oraclelinux" - dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')" - ;; - - fedora|centos) - dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')" - ;; - - *) - if command_exists lsb_release; then - dist_version="$(lsb_release --codename | cut -f2)" - fi - if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then - dist_version="$(. /etc/os-release && echo "$VERSION_ID")" - fi - ;; - - - esac - - - # Run setup for each distro accordingly - case "$lsb_dist" in - ubuntu|debian) - export DEBIAN_FRONTEND=noninteractive - - did_apt_get_update= - apt_get_update() { - if [ -z "$did_apt_get_update" ]; then - ( set -x; $sh_c 'sleep 3; apt-get update' ) - did_apt_get_update=1 - fi - } - - # aufs is preferred over devicemapper; try to ensure the driver is available. - if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then - if uname -r | grep -q -- '-generic' && dpkg -l 'linux-image-*-generic' | grep -qE '^ii|^hi' 2>/dev/null; then - kern_extras="linux-image-extra-$(uname -r) linux-image-extra-virtual" - - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q '"$kern_extras" ) || true - - if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then - echo >&2 'Warning: tried to install '"$kern_extras"' (for AUFS)' - echo >&2 ' but we still have no AUFS. Docker may not work. Proceeding anyways!' - ( set -x; sleep 10 ) - fi - else - echo >&2 'Warning: current kernel is not supported by the linux-image-extra-virtual' - echo >&2 ' package. We have no AUFS support. Consider installing the packages' - echo >&2 ' linux-image-virtual kernel and linux-image-extra-virtual for AUFS support.' - ( set -x; sleep 10 ) - fi - fi - - # install apparmor utils if they're missing and apparmor is enabled in the kernel - # otherwise Docker will fail to start - if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then - if command -v apparmor_parser >/dev/null 2>&1; then - echo 'apparmor is enabled in the kernel and apparmor utils were already installed' - else - echo 'apparmor is enabled in the kernel, but apparmor_parser missing' - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q apparmor' ) - fi - fi - - if [ ! -e /usr/lib/apt/methods/https ]; then - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q apt-transport-https ca-certificates' ) - fi - if [ -z "$curl" ]; then - apt_get_update - ( set -x; $sh_c 'sleep 3; apt-get install -y -q curl ca-certificates' ) - curl='curl -sSL' - fi - ( - set -x - for key_server in $key_servers ; do - $sh_c "apt-key adv --keyserver hkp://${key_server}:80 --recv-keys ${gpg_fingerprint}" && break - done - $sh_c "apt-key adv -k ${gpg_fingerprint} >/dev/null" - $sh_c "mkdir -p /etc/apt/sources.list.d" - $sh_c "echo deb [arch=$(dpkg --print-architecture)] ${apt_url}/repo ${lsb_dist}-${dist_version} ${repo} > /etc/apt/sources.list.d/docker.list" - $sh_c 'sleep 3; apt-get update' - if [ -z "$DOCKER_VERSION" ]; then - $sh_c 'apt-get -o Dpkg::Options::="--force-confnew" install -y -q docker-engine' - else - $sh_c "apt-get -o Dpkg::Options::=\"--force-confnew\" install -y -q docker-engine=$DOCKER_VERSION" - fi - ) - exit 0 - ;; - - fedora|centos|oraclelinux) - $sh_c "cat >/etc/yum.repos.d/docker-${repo}.repo" <<-EOF - [docker-${repo}-repo] - name=Docker ${repo} Repository - baseurl=${yum_url}/repo/${repo}/${lsb_dist}/${dist_version} - enabled=1 - gpgcheck=1 - gpgkey=${yum_url}/gpg - EOF - if [ "$lsb_dist" = "fedora" ] && [ "$dist_version" -ge "22" ]; then - ( - set -x - $sh_c 'sleep 3; dnf -y -q install docker-engine' - ) - else - ( - set -x - $sh_c 'sleep 3; yum -y -q install docker-engine' - ) - fi - exit 0 - ;; - gentoo) - if [ "$url" = "https://test.docker.com/" ]; then - # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output - cat >&2 <<-'EOF' - - You appear to be trying to install the latest nightly build in Gentoo.' - The portage tree should contain the latest stable release of Docker, but' - if you want something more recent, you can always use the live ebuild' - provided in the "docker" overlay available via layman. For more' - instructions, please see the following URL:' - - https://github.com/tianon/docker-overlay#using-this-overlay' - - After adding the "docker" overlay, you should be able to:' - - emerge -av =app-emulation/docker-9999' - - EOF - exit 1 - fi - - ( - set -x - $sh_c 'sleep 3; emerge app-emulation/docker' - ) - exit 0 - ;; - esac - - # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output - cat >&2 <<-'EOF' - - Either your platform is not easily detectable, is not supported by this - installer script (yet - PRs welcome! [hack/install.sh]), or does not yet have - a package for Docker. Please visit the following URL for more detailed - installation instructions: - - https://docs.docker.com/engine/installation/ - - EOF - exit 1 -} - -# wrapped up in a function so that we have some protection against only getting -# half the file during "curl | sh" -do_install diff --git a/.ci/setup_docker.sh b/.ci/setup_docker.sh deleted file mode 100755 index df9cf205a..000000000 --- a/.ci/setup_docker.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -set -exu - -DOCKER_VERSION="${DOCKER_VERSION:-}" -DOCKER_HOST="${DOCKER_HOST:-}" - -if [[ -n $DOCKER_VERSION ]]; then - sudo -E apt-get -q -y --purge remove docker-engine docker-ce - - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - sudo apt-get update - sudo apt-cache madison docker-ce - sudo apt-get install "docker-ce=$DOCKER_VERSION" -fi - -if [[ -n $DOCKER_HOST ]]; then - sudo mkdir -p /etc/systemd/system/docker.service.d/ - - echo " -[Service] -ExecStart= -ExecStart=/usr/bin/dockerd -H $DOCKER_HOST -H unix:///var/run/docker.sock - " | sudo tee -a /etc/systemd/system/docker.service.d/override.conf - - sudo systemctl daemon-reload - sudo service docker restart || sudo journalctl -xe - sudo service docker status -fi - -while (! docker ps ); do - echo "Waiting for Docker to launch..." - sleep 1 -done -docker version -docker info - -docker run --rm hello-world diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03cc0034d..b7aaef550 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,9 +15,7 @@ jobs: - { name: "default", javaVersion: 8 } - { name: "default", javaVersion: 17 } - { name: "default", javaVersion: 21 } - - { name: "over TCP", dockerHost: "tcp://127.0.0.1:2375", javaVersion: 8 } - - { name: "Docker 19.03.9", dockerVersion: "5:19.03.9~3-0~ubuntu-focal", javaVersion: 8 } - + - { name: "Docker 19.03.9", dockerVersion: "v19.03.9", javaVersion: 8 } steps: - uses: actions/checkout@v4 - name: Set up JDK @@ -26,13 +24,32 @@ jobs: java-version: ${{matrix.javaVersion}} distribution: temurin - name: Configure Docker + id: setup_docker + uses: docker/setup-docker-action@v4 + with: + version: ${{matrix.dockerVersion}} + channel: stable + - name: Build with Maven env: - DOCKER_VERSION: ${{matrix.dockerVersion}} - DOCKER_HOST: ${{matrix.dockerHost}} - run: .ci/setup_docker.sh + DOCKER_HOST: ${{steps.setup_docker.outputs.sock}} + run: ./mvnw --no-transfer-progress verify + + tcp: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v4 + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 8 + distribution: temurin + - name: Configure Docker + id: setup_docker + uses: docker/setup-docker-action@v4 + with: + channel: stable + tcp-port: 2375 - name: Build with Maven env: - DOCKER_HOST: ${{matrix.dockerHost}} - run: | - [[ -z "$DOCKER_HOST" ]] && unset DOCKER_HOST - ./mvnw --no-transfer-progress verify + DOCKER_HOST: ${{steps.setup_docker.outputs.tcp}} + run: ./mvnw --no-transfer-progress verify From 2d129c317e47a9f3a92d0739a8be775f1452ea02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 6 Mar 2025 11:01:07 -0600 Subject: [PATCH 043/137] Add MountType.Image and ImageOptions (#2386) Supported in API v1.48 --- .../dockerjava/api/model/ImageOptions.java | 27 +++++++++++++++++++ .../github/dockerjava/api/model/Mount.java | 25 +++++++++++++++++ .../dockerjava/api/model/MountType.java | 6 ++++- 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageOptions.java diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageOptions.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageOptions.java new file mode 100644 index 000000000..bc8b89acb --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageOptions.java @@ -0,0 +1,27 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.io.Serializable; + +/** + * @since {@link RemoteApiVersion#VERSION_1_48} + */ +@EqualsAndHashCode +@ToString +public class ImageOptions extends DockerObject implements Serializable { + private static final long serialVersionUID = 1L; + @JsonProperty("Subpath") + private String subpath; + + public String getSubpath() { + return subpath; + } + + public ImageOptions withSubpath(String subpath) { + this.subpath = subpath; + return this; + } +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Mount.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Mount.java index 9bfe9b16e..3f17343c3 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Mount.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Mount.java @@ -57,6 +57,12 @@ public class Mount extends DockerObject implements Serializable { @JsonProperty("TmpfsOptions") private TmpfsOptions tmpfsOptions; + /** + * @since 1.48 + */ + @JsonProperty("ImageOptions") + private ImageOptions imageOptions; + /** * @see #type */ @@ -177,4 +183,23 @@ public Mount withTmpfsOptions(TmpfsOptions tmpfsOptions) { } return this; } + + /** + * @see #imageOptions + */ + @CheckForNull + public ImageOptions getImageOptions() { + return imageOptions; + } + + /** + * @see #imageOptions + */ + public Mount withImageOptions(ImageOptions imageOptions) { + this.imageOptions = imageOptions; + if (imageOptions != null) { + this.type = MountType.IMAGE; + } + return this; + } } diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/MountType.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/MountType.java index 219782a56..b522c9612 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/MountType.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/MountType.java @@ -18,6 +18,10 @@ public enum MountType { //@since 1.40 @JsonProperty("npipe") - NPIPE + NPIPE, + + //@since 1.48 + @JsonProperty("image") + IMAGE, } From 6ae1eb4481d22985018ec3bcd1c5e51628d14b5a Mon Sep 17 00:00:00 2001 From: Lars <60571459+LarsSven@users.noreply.github.com> Date: Thu, 20 Mar 2025 16:38:54 +0100 Subject: [PATCH 044/137] Add setters for security options and runtimes (#2384) --- .../com/github/dockerjava/api/model/Info.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java index 75afefd2b..67348b86b 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java @@ -1108,14 +1108,33 @@ public Info withIsolation(String isolation) { return this; } + /** + * @see #securityOptions + */ public List getSecurityOptions() { return securityOptions; } + /** + * @see #securityOptions + */ + public Info withSecurityOptions(List securityOptions) { + this.securityOptions = securityOptions; + return this; + } + /** * @see #runtimes */ public Map getRuntimes() { return runtimes; } + + /** + * @see #runtimes + */ + public Info withRuntimes(Map runtimes) { + this.runtimes = runtimes; + return this; + } } From ece155bc78dd48cdea2b75219e5950c70be29437 Mon Sep 17 00:00:00 2001 From: Oleg Kalnichevski Date: Tue, 1 Apr 2025 17:44:59 +0200 Subject: [PATCH 045/137] Upgrade Apache HttpClient to version 5.4 (#2364) * Upgraded Apache HttpClient to version 5.4.2; Fixed connection initialization for non-HTTP protocol * Remove usage of deprecated API --- docker-java-transport-httpclient5/pom.xml | 2 +- .../ApacheDockerHttpClientImpl.java | 123 ++++++++---------- .../HijackingHttpRequestExecutor.java | 8 +- 3 files changed, 58 insertions(+), 75 deletions(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 48b751d56..54c90185a 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -29,7 +29,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.0.3 + 5.4.2 diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java index 4820c65e5..c97a2bc45 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java @@ -4,31 +4,34 @@ import com.github.dockerjava.transport.NamedPipeSocket; import com.github.dockerjava.transport.SSLConfig; import com.github.dockerjava.transport.UnixSocket; + +import org.apache.hc.client5.http.SystemDefaultDnsResolver; import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; +import org.apache.hc.client5.http.config.ConnectionConfig; import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.impl.DefaultSchemePortResolver; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator; import org.apache.hc.client5.http.impl.io.ManagedHttpClientConnectionFactory; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; -import org.apache.hc.client5.http.socket.ConnectionSocketFactory; -import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory; -import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.client5.http.io.HttpClientConnectionOperator; +import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy; +import org.apache.hc.client5.http.ssl.TlsSocketStrategy; +import org.apache.hc.core5.http.ClassicHttpResponse; import org.apache.hc.core5.http.ConnectionClosedException; import org.apache.hc.core5.http.ContentLengthStrategy; import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.HttpHeaders; import org.apache.hc.core5.http.HttpHost; import org.apache.hc.core5.http.NameValuePair; -import org.apache.hc.core5.http.config.Registry; -import org.apache.hc.core5.http.config.RegistryBuilder; import org.apache.hc.core5.http.impl.DefaultContentLengthStrategy; -import org.apache.hc.core5.http.impl.io.EmptyInputStream; import org.apache.hc.core5.http.io.SocketConfig; import org.apache.hc.core5.http.io.entity.ByteArrayEntity; +import org.apache.hc.core5.http.io.entity.EmptyInputStream; import org.apache.hc.core5.http.io.entity.InputStreamEntity; -import org.apache.hc.core5.http.protocol.BasicHttpContext; import org.apache.hc.core5.http.protocol.HttpContext; +import org.apache.hc.core5.http.protocol.HttpCoreContext; import org.apache.hc.core5.net.URIAuthority; import org.apache.hc.core5.util.TimeValue; import org.apache.hc.core5.util.Timeout; @@ -38,7 +41,6 @@ import javax.net.ssl.SSLContext; import java.io.IOException; import java.io.InputStream; -import java.net.InetSocketAddress; import java.net.Socket; import java.net.URI; import java.time.Duration; @@ -61,7 +63,13 @@ protected ApacheDockerHttpClientImpl( Duration connectionTimeout, Duration responseTimeout ) { - Registry socketFactoryRegistry = createConnectionSocketFactoryRegistry(sslConfig, dockerHost); + SSLContext sslContext; + try { + sslContext = sslConfig != null ? sslConfig.getSSLContext() : null; + } catch (Exception e) { + throw new RuntimeException(e); + } + HttpClientConnectionOperator connectionOperator = createConnectionOperator(dockerHost, sslContext); switch (dockerHost.getScheme()) { case "unix": @@ -75,7 +83,7 @@ protected ApacheDockerHttpClientImpl( ? rawPath.substring(0, rawPath.length() - 1) : rawPath; host = new HttpHost( - socketFactoryRegistry.lookup("https") != null ? "https" : "http", + sslContext != null ? "https" : "http", dockerHost.getHost(), dockerHost.getPort() ); @@ -85,7 +93,10 @@ protected ApacheDockerHttpClientImpl( } PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager( - socketFactoryRegistry, + connectionOperator, + null, + null, + null, new ManagedHttpClientConnectionFactory( null, null, @@ -109,77 +120,49 @@ protected ApacheDockerHttpClientImpl( .setSoTimeout(Timeout.ZERO_MILLISECONDS) .build() ); - connectionManager.setValidateAfterInactivity(TimeValue.NEG_ONE_SECOND); connectionManager.setMaxTotal(maxConnections); connectionManager.setDefaultMaxPerRoute(maxConnections); - RequestConfig.Builder defaultRequest = RequestConfig.custom(); - if (connectionTimeout != null) { - defaultRequest.setConnectTimeout(connectionTimeout.toNanos(), TimeUnit.NANOSECONDS); - } - if (responseTimeout != null) { - defaultRequest.setResponseTimeout(responseTimeout.toNanos(), TimeUnit.NANOSECONDS); - } + connectionManager.setDefaultConnectionConfig(ConnectionConfig.custom() + .setValidateAfterInactivity(TimeValue.NEG_ONE_SECOND) + .setConnectTimeout(connectionTimeout != null ? Timeout.of(connectionTimeout.toNanos(), TimeUnit.NANOSECONDS) : null) + .build()); httpClient = HttpClients.custom() .setRequestExecutor(new HijackingHttpRequestExecutor(null)) .setConnectionManager(connectionManager) - .setDefaultRequestConfig(defaultRequest.build()) + .setDefaultRequestConfig(RequestConfig.custom() + .setResponseTimeout(responseTimeout != null ? Timeout.of(responseTimeout.toNanos(), TimeUnit.NANOSECONDS) : null) + .build()) .disableConnectionState() .build(); } - private Registry createConnectionSocketFactoryRegistry( - SSLConfig sslConfig, - URI dockerHost + private HttpClientConnectionOperator createConnectionOperator( + URI dockerHost, + SSLContext sslContext ) { - RegistryBuilder socketFactoryRegistryBuilder = RegistryBuilder.create(); - - if (sslConfig != null) { - try { - SSLContext sslContext = sslConfig.getSSLContext(); - if (sslContext != null) { - socketFactoryRegistryBuilder.register("https", new SSLConnectionSocketFactory(sslContext)); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - return socketFactoryRegistryBuilder - .register("tcp", PlainConnectionSocketFactory.INSTANCE) - .register("http", PlainConnectionSocketFactory.INSTANCE) - .register("unix", new ConnectionSocketFactory() { - @Override - public Socket createSocket(HttpContext context) throws IOException { - return UnixSocket.get(dockerHost.getPath()); + String dockerHostScheme = dockerHost.getScheme(); + String dockerHostPath = dockerHost.getPath(); + TlsSocketStrategy tlsSocketStrategy = sslContext != null ? + new DefaultClientTlsStrategy(sslContext) : DefaultClientTlsStrategy.createSystemDefault(); + return new DefaultHttpClientConnectionOperator( + socksProxy -> { + if ("unix".equalsIgnoreCase(dockerHostScheme)) { + return UnixSocket.get(dockerHostPath); + } else if ("npipe".equalsIgnoreCase(dockerHostScheme)) { + return new NamedPipeSocket(dockerHostPath); + } else { + return socksProxy == null ? new Socket() : new Socket(socksProxy); } - - @Override - public Socket connectSocket(TimeValue timeValue, Socket socket, HttpHost httpHost, InetSocketAddress inetSocketAddress, - InetSocketAddress inetSocketAddress1, HttpContext httpContext) throws IOException { - return PlainConnectionSocketFactory.INSTANCE.connectSocket(timeValue, socket, httpHost, inetSocketAddress, - inetSocketAddress1, httpContext); - } - }) - .register("npipe", new ConnectionSocketFactory() { - @Override - public Socket createSocket(HttpContext context) { - return new NamedPipeSocket(dockerHost.getPath()); - } - - @Override - public Socket connectSocket(TimeValue timeValue, Socket socket, HttpHost httpHost, InetSocketAddress inetSocketAddress, - InetSocketAddress inetSocketAddress1, HttpContext httpContext) throws IOException { - return PlainConnectionSocketFactory.INSTANCE.connectSocket(timeValue, socket, httpHost, inetSocketAddress, - inetSocketAddress1, httpContext); - } - }) - .build(); + }, + DefaultSchemePortResolver.INSTANCE, + SystemDefaultDnsResolver.INSTANCE, + name -> "https".equalsIgnoreCase(name) ? tlsSocketStrategy : null); } @Override public Response execute(Request request) { - HttpContext context = new BasicHttpContext(); + HttpContext context = new HttpCoreContext(); HttpUriRequestBase httpUriRequest = new HttpUriRequestBase(request.method(), URI.create(pathPrefix + request.path())); httpUriRequest.setScheme(host.getSchemeName()); httpUriRequest.setAuthority(new URIAuthority(host.getHostName(), host.getPort())); @@ -203,7 +186,7 @@ public Response execute(Request request) { } try { - CloseableHttpResponse response = httpClient.execute(host, httpUriRequest, context); + ClassicHttpResponse response = httpClient.executeOpen(host, httpUriRequest, context); return new ApacheResponse(httpUriRequest, response); } catch (IOException e) { @@ -222,9 +205,9 @@ static class ApacheResponse implements Response { private final HttpUriRequestBase request; - private final CloseableHttpResponse response; + private final ClassicHttpResponse response; - ApacheResponse(HttpUriRequestBase httpUriRequest, CloseableHttpResponse response) { + ApacheResponse(HttpUriRequestBase httpUriRequest, ClassicHttpResponse response) { this.request = httpUriRequest; this.response = response; } diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/HijackingHttpRequestExecutor.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/HijackingHttpRequestExecutor.java index 59888a5dd..df8fbd059 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/HijackingHttpRequestExecutor.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/HijackingHttpRequestExecutor.java @@ -44,7 +44,7 @@ public ClassicHttpResponse execute( InputStream hijackedInput = (InputStream) context.getAttribute(HIJACKED_INPUT_ATTRIBUTE); if (hijackedInput != null) { - return executeHijacked(request, conn, context, hijackedInput); + return executeHijacked(request, conn, (HttpCoreContext) context, hijackedInput); } return super.execute(request, conn, informationCallback, context); @@ -53,12 +53,12 @@ public ClassicHttpResponse execute( private ClassicHttpResponse executeHijacked( ClassicHttpRequest request, HttpClientConnection conn, - HttpContext context, + HttpCoreContext context, InputStream hijackedInput ) throws HttpException, IOException { try { - context.setAttribute(HttpCoreContext.SSL_SESSION, conn.getSSLSession()); - context.setAttribute(HttpCoreContext.CONNECTION_ENDPOINT, conn.getEndpointDetails()); + context.setSSLSession(conn.getSSLSession()); + context.setEndpointDetails(conn.getEndpointDetails()); final ProtocolVersion transportVersion = request.getVersion(); if (transportVersion != null) { context.setProtocolVersion(transportVersion); From 3a367b6ab2336cf1f61106ffa2c30545277b7ad3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:24:18 -0600 Subject: [PATCH 046/137] Bump org.assertj:assertj-core from 3.24.2 to 3.27.3 (#2291) Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.24.2 to 3.27.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.24.2...assertj-build-3.27.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 2e4bd79ce..4d6dd5738 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -34,7 +34,7 @@ org.assertj assertj-core - 3.24.2 + 3.27.3 From 97ea93b416d1e29b8614a7278f8a5850111735d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:25:34 -0600 Subject: [PATCH 047/137] Bump org.apache.httpcomponents.client5:httpclient5 from 5.4.2 to 5.4.3 (#2272) Bumps [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client) from 5.4.2 to 5.4.3. - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.2...rel/v5.4.3) --- updated-dependencies: - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-httpclient5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 54c90185a..71f0ada1d 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -29,7 +29,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.2 + 5.4.3 From 24204a57ca95ea8108709843eba5750ba3a3bc33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:30:51 -0600 Subject: [PATCH 048/137] Bump junixsocket.version from 2.6.1 to 2.10.1 (#2249) Bumps `junixsocket.version` from 2.6.1 to 2.10.1. Updates `com.kohlschutter.junixsocket:junixsocket-common` from 2.6.1 to 2.10.1 - [Release notes](https://github.com/kohlschutter/junixsocket/releases) - [Commits](https://github.com/kohlschutter/junixsocket/compare/junixsocket-2.6.1...junixsocket-2.10.1) --- updated-dependencies: - dependency-name: com.kohlschutter.junixsocket:junixsocket-common dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.kohlschutter.junixsocket:junixsocket-native-common dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f58a3d448..00125501f 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ 1.7.30 1.76 - 2.6.1 + 2.10.1 19.0 From ed50e5c186fb66e462d5d77c9371c874e8bf6eef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:31:35 -0600 Subject: [PATCH 049/137] Bump org.junit.jupiter:junit-jupiter from 5.10.0 to 5.12.1 (#2241) Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.0 to 5.12.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.12.1) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index 82d176e38..ce52af8c2 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -50,7 +50,7 @@ org.junit.jupiter junit-jupiter - 5.10.0 + 5.12.1 test From 37a7d00e6fca2e4d33bfd37163af77ef50c19bb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:32:17 -0600 Subject: [PATCH 050/137] Bump com.github.siom79.japicmp:japicmp-maven-plugin (#2238) Bumps [com.github.siom79.japicmp:japicmp-maven-plugin](https://github.com/siom79/japicmp) from 0.18.2 to 0.23.1. - [Release notes](https://github.com/siom79/japicmp/releases) - [Changelog](https://github.com/siom79/japicmp/blob/master/release.py) - [Commits](https://github.com/siom79/japicmp/compare/japicmp-base-0.18.2...japicmp-base-0.23.1) --- updated-dependencies: - dependency-name: com.github.siom79.japicmp:japicmp-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 00125501f..ca273f658 100644 --- a/pom.xml +++ b/pom.xml @@ -244,7 +244,7 @@ com.github.siom79.japicmp japicmp-maven-plugin - 0.18.3 + 0.23.1 From b7415f805d39071e3484d2bdcb8177013aad9aac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:33:06 -0600 Subject: [PATCH 051/137] Bump org.apache.commons:commons-lang3 from 3.12.0 to 3.17.0 (#2259) Bumps org.apache.commons:commons-lang3 from 3.12.0 to 3.17.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ca273f658..c05699a5f 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 4.5.12 1.21 2.13.0 - 3.12.0 + 3.17.0 1.7.30 1.76 From 3580299112bf27953a64f80c7de1bb0c7075a7bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:40:00 -0600 Subject: [PATCH 052/137] Bump net.java.dev.jna:jna from 5.13.0 to 5.17.0 (#2273) Bumps [net.java.dev.jna:jna](https://github.com/java-native-access/jna) from 5.13.0 to 5.17.0. - [Changelog](https://github.com/java-native-access/jna/blob/master/CHANGES.md) - [Commits](https://github.com/java-native-access/jna/compare/5.13.0...5.17.0) --- updated-dependencies: - dependency-name: net.java.dev.jna:jna dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-httpclient5/pom.xml | 2 +- docker-java-transport-okhttp/pom.xml | 2 +- docker-java-transport/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 71f0ada1d..0e82715e9 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -35,7 +35,7 @@ net.java.dev.jna jna - 5.13.0 + 5.17.0 diff --git a/docker-java-transport-okhttp/pom.xml b/docker-java-transport-okhttp/pom.xml index df14ad077..3bac0cead 100644 --- a/docker-java-transport-okhttp/pom.xml +++ b/docker-java-transport-okhttp/pom.xml @@ -35,7 +35,7 @@ net.java.dev.jna jna - 5.13.0 + 5.17.0 diff --git a/docker-java-transport/pom.xml b/docker-java-transport/pom.xml index 2ca377dd6..3f595903a 100644 --- a/docker-java-transport/pom.xml +++ b/docker-java-transport/pom.xml @@ -37,7 +37,7 @@ net.java.dev.jna jna - 5.13.0 + 5.17.0 provided From 31d5a2126569d30b7c630a573c3dfe600237f1b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:49:07 -0600 Subject: [PATCH 053/137] Bump commons-io:commons-io from 2.13.0 to 2.18.0 (#2263) Bumps commons-io:commons-io from 2.13.0 to 2.18.0. --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c05699a5f..ba67f88c6 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 2.10.3 4.5.12 1.21 - 2.13.0 + 2.18.0 3.17.0 1.7.30 From 41acb642c1209089fa3af875e4f4b3bcc4603817 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:55:01 -0600 Subject: [PATCH 054/137] Bump org.bouncycastle:bcpkix-jdk18on from 1.76 to 1.80 (#2254) Bumps [org.bouncycastle:bcpkix-jdk18on](https://github.com/bcgit/bc-java) from 1.76 to 1.80. - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) --- updated-dependencies: - dependency-name: org.bouncycastle:bcpkix-jdk18on dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba67f88c6..3c75097d6 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 3.17.0 1.7.30 - 1.76 + 1.80 2.10.1 19.0 From 4a9bf71248a15c35896ffbd56d737d562e8e909a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:56:40 -0600 Subject: [PATCH 055/137] Bump netty.version from 4.1.46.Final to 4.1.119.Final (#2302) Bumps `netty.version` from 4.1.46.Final to 4.1.119.Final. Updates `io.netty:netty-codec-http` from 4.1.46.Final to 4.1.119.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.46.Final...netty-4.1.119.Final) Updates `io.netty:netty-handler` from 4.1.46.Final to 4.1.106.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.46.Final...netty-4.1.119.Final) Updates `io.netty:netty-handler-proxy` from 4.1.46.Final to 4.1.106.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.46.Final...netty-4.1.119.Final) Updates `io.netty:netty-transport-native-epoll` from 4.1.46.Final to 4.1.106.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.46.Final...netty-4.1.119.Final) Updates `io.netty:netty-transport-native-kqueue` from 4.1.46.Final to 4.1.106.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.46.Final...netty-4.1.119.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler-proxy dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-epoll dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-kqueue dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3c75097d6..71c5c6025 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,7 @@ 1.2.3 - 4.1.46.Final + 4.1.119.Final 2.2 1.8 2.3.3 From 353554b001ecdbf556326b83e7d56d0b56b9dd1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 11:19:35 -0600 Subject: [PATCH 056/137] Bump jackson.version from 2.8.8 to 2.18.3 (#2283) Bumps `jackson.version` from 2.8.8 to 2.18.3. Updates `com.fasterxml.jackson.core:jackson-annotations` from 2.8.8 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.8.8 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-annotations dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java/pom.xml | 8 ++++---- pom.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docker-java/pom.xml b/docker-java/pom.xml index e3c3690f1..a80e7eeef 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -125,16 +125,16 @@ com.fasterxml.jackson.core jackson-databind - - 2.8.8 + + 2.18.3 test com.fasterxml.jackson.core jackson-annotations - - 2.8.8 + + 2.18.3 test diff --git a/pom.xml b/pom.xml index 71c5c6025..63d09355c 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ 1.8 2.30.1 - 2.10.3 + 2.18.3 2.10.3 4.5.12 1.21 From 4fe0ae49268e873eb358b994fdd277718e287402 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 11:31:36 -0600 Subject: [PATCH 057/137] Bump com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider (#2281) Bumps com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider from 2.10.3 to 2.18.3. --- updated-dependencies: - dependency-name: com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 63d09355c..05585d331 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 2.30.1 2.18.3 - 2.10.3 + 2.18.3 4.5.12 1.21 2.18.0 From 4bfb74f88485a36dd0c09ae093edbcaa66d93722 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 11:38:22 -0600 Subject: [PATCH 058/137] Bump org.projectlombok:lombok from 1.18.22 to 1.18.38 (#2210) Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.22 to 1.18.38. - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.22...v1.18.38) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- docker-java/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index ce52af8c2..839d6ccb2 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -42,7 +42,7 @@ org.projectlombok lombok - 1.18.30 + 1.18.38 provided diff --git a/docker-java/pom.xml b/docker-java/pom.xml index a80e7eeef..de8cb9c88 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -141,7 +141,7 @@ org.projectlombok lombok - 1.18.30 + 1.18.38 provided From a349b48b20b51c35129c6bbbb9535d226d9c1c36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 12:04:25 -0600 Subject: [PATCH 059/137] Bump org.apache.commons:commons-compress from 1.21 to 1.27.1 (#2256) Bumps org.apache.commons:commons-compress from 1.21 to 1.27.1. --- updated-dependencies: - dependency-name: org.apache.commons:commons-compress dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 05585d331..8ec664b11 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 2.18.3 2.18.3 4.5.12 - 1.21 + 1.27.1 2.18.0 3.17.0 1.7.30 From 77766d0081468ccc2595b92bf2c6ef8ec4ebc455 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 12:18:08 -0600 Subject: [PATCH 060/137] Bump org.immutables:value from 2.8.2 to 2.10.1 (#2220) Bumps [org.immutables:value](https://github.com/immutables/immutables) from 2.8.2 to 2.10.1. - [Release notes](https://github.com/immutables/immutables/releases) - [Commits](https://github.com/immutables/immutables/compare/2.8.2...2.10.1) --- updated-dependencies: - dependency-name: org.immutables:value dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport/pom.xml b/docker-java-transport/pom.xml index 3f595903a..96f1f850a 100644 --- a/docker-java-transport/pom.xml +++ b/docker-java-transport/pom.xml @@ -30,7 +30,7 @@ org.immutables value - 2.8.2 + 2.10.1 provided From a404bd1aa4ad692da58c10b5a75e8774468216de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 1 Apr 2025 12:36:28 -0600 Subject: [PATCH 061/137] Fix InspectContainerResponse data types to be able to hold an int64 (#2392) * Fix data types to be able to hold an int64 * Add japicmp exclusions in docker-java-api Fixes #2321 --------- Co-authored-by: Torsten Krah --- docker-java-api/pom.xml | 9 +++++++++ .../dockerjava/api/command/InspectContainerResponse.java | 8 ++++---- .../com/github/dockerjava/cmd/InspectContainerCmdIT.java | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index 839d6ccb2..1138a27f7 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -84,6 +84,15 @@ com.github.siom79.japicmp japicmp-maven-plugin + + + + + com.github.dockerjava.api.command.InspectContainerResponse#getSizeRootFs() + com.github.dockerjava.api.command.InspectContainerResponse#getSizeRw() + + + diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java index 94207fd2c..f06bd4ed9 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java @@ -61,10 +61,10 @@ public class InspectContainerResponse extends DockerObject { private String id; @JsonProperty("SizeRootFs") - private Integer sizeRootFs; + private Long sizeRootFs; @JsonProperty("SizeRw") - private Integer sizeRw; + private Long sizeRw; @JsonProperty("Image") private String imageId; @@ -124,11 +124,11 @@ public String getId() { return id; } - public Integer getSizeRootFs() { + public Long getSizeRootFs() { return sizeRootFs; } - public Integer getSizeRw() { + public Long getSizeRw() { return sizeRw; } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java index 54d900db8..cc1468f7f 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java @@ -100,9 +100,9 @@ public void inspectContainerWithSize() throws DockerException { // TODO check swarm if (isNotSwarm(dockerRule.getClient())) { assertNotNull(containerInfo.getSizeRootFs()); - assertTrue(containerInfo.getSizeRootFs().intValue() > 0); + assertTrue(containerInfo.getSizeRootFs() > 0L); assertNotNull(containerInfo.getSizeRw()); - assertTrue(containerInfo.getSizeRw().intValue() == 0); + assertEquals(0L, containerInfo.getSizeRw().longValue()); } } From cb72675f16ce0f5c3561a9c6cf8925bc048d1034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 1 Apr 2025 12:41:44 -0600 Subject: [PATCH 062/137] Run dependabot on Tuesday --- .github/dependabot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7dec19aef..d301147be 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,5 +4,6 @@ updates: directory: "/" schedule: interval: weekly + day: tuesday open-pull-requests-limit: 99 rebase-strategy: disabled From 1d6c3445c7877e0511e1fcb55708568b254831f6 Mon Sep 17 00:00:00 2001 From: Nikita Nikolenko Date: Tue, 1 Apr 2025 20:46:49 +0200 Subject: [PATCH 063/137] Add some missed options to UpdateContainerCmd (#2389) * Add some missed options to UpdateContainerCmd * Delete old cpuPeriod and cpuQuota functions * Add update container response tests --- docker-java-api/pom.xml | 5 +- .../api/command/UpdateContainerCmd.java | 97 +++++- .../core/command/UpdateContainerCmdImpl.java | 293 +++++++++++++++++- .../api/command/CommandJSONSamples.java | 4 +- .../command/UpdateContainerResponseTest.java | 33 ++ .../dockerjava/cmd/UpdateContainerCmdIT.java | 4 +- .../updateContainerResponse_empty.json | 1 + .../updateContainerResponse_warnings.json | 5 + 8 files changed, 420 insertions(+), 22 deletions(-) create mode 100644 docker-java/src/test/java/com/github/dockerjava/api/command/UpdateContainerResponseTest.java create mode 100644 docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_empty.json create mode 100644 docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_warnings.json diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index 1138a27f7..8bfd9e8d4 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -87,7 +87,10 @@ - + com.github.dockerjava.api.command.UpdateContainerCmd#getCpuPeriod() + com.github.dockerjava.api.command.UpdateContainerCmd#withCpuPeriod(java.lang.Integer) + com.github.dockerjava.api.command.UpdateContainerCmd#getCpuQuota() + com.github.dockerjava.api.command.UpdateContainerCmd#withCpuQuota(java.lang.Integer) com.github.dockerjava.api.command.InspectContainerResponse#getSizeRootFs() com.github.dockerjava.api.command.InspectContainerResponse#getSizeRw() diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java index 82fbca5f8..d53bcdcdf 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/UpdateContainerCmd.java @@ -1,9 +1,16 @@ package com.github.dockerjava.api.command; +import com.github.dockerjava.api.model.BlkioRateDevice; +import com.github.dockerjava.api.model.BlkioWeightDevice; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.DeviceRequest; +import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.Ulimit; import com.github.dockerjava.api.model.UpdateContainerResponse; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import java.util.List; /** * @author Kanstantsin Shautsou @@ -13,22 +20,47 @@ public interface UpdateContainerCmd extends SyncDockerCmd getBlkioWeightDevice(); + + UpdateContainerCmd withBlkioWeightDevice(List blkioWeightDevice); @CheckForNull - Integer getCpuPeriod(); + List getBlkioDeviceReadBps(); - UpdateContainerCmd withCpuPeriod(Integer cpuPeriod); + UpdateContainerCmd withBlkioDeviceReadBps(List blkioDeviceReadBps); @CheckForNull - Integer getCpuQuota(); + List getBlkioDeviceWriteBps(); - UpdateContainerCmd withCpuQuota(Integer cpuQuota); + UpdateContainerCmd withBlkioDeviceWriteBps(List blkioDeviceWriteBps); + + @CheckForNull + List getBlkioDeviceReadIOps(); + + UpdateContainerCmd withBlkioDeviceReadIOps(List blkioDeviceReadIOps); + + @CheckForNull + List getBlkioDeviceWriteIOps(); + + UpdateContainerCmd withBlkioDeviceWriteIOps(List blkioDeviceWriteIOps); + + @CheckForNull + Long getCpuPeriod(); + + UpdateContainerCmd withCpuPeriod(Long cpuPeriod); + + @CheckForNull + Long getCpuQuota(); + + UpdateContainerCmd withCpuQuota(Long cpuQuota); @CheckForNull String getCpusetCpus(); @@ -45,6 +77,31 @@ public interface UpdateContainerCmd extends SyncDockerCmd getDevices(); + + UpdateContainerCmd withDevices(List devices); + + @CheckForNull + List getDeviceCgroupRules(); + + UpdateContainerCmd withDeviceCgroupRules(List deviceCgroupRules); + + @CheckForNull + List getDeviceRequests(); + + UpdateContainerCmd withDeviceRequests(List deviceRequests); + @CheckForNull Long getKernelMemory(); @@ -65,6 +122,36 @@ public interface UpdateContainerCmd extends SyncDockerCmd getUlimits(); + + UpdateContainerCmd withUlimits(List ulimits); + + @CheckForNull + RestartPolicy getRestartPolicy(); + + UpdateContainerCmd withRestartPolicy(RestartPolicy restartPolicy); + interface Exec extends DockerCmdSyncExec { } } diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateContainerCmdImpl.java index 14357ba08..47ab710eb 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/UpdateContainerCmdImpl.java @@ -4,6 +4,12 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.github.dockerjava.api.command.UpdateContainerCmd; import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.BlkioRateDevice; +import com.github.dockerjava.api.model.BlkioWeightDevice; +import com.github.dockerjava.api.model.Device; +import com.github.dockerjava.api.model.DeviceRequest; +import com.github.dockerjava.api.model.RestartPolicy; +import com.github.dockerjava.api.model.Ulimit; import com.github.dockerjava.api.model.UpdateContainerResponse; import com.github.dockerjava.core.RemoteApiVersion; import org.apache.commons.lang3.builder.EqualsBuilder; @@ -12,6 +18,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import java.util.List; /** * @author Kanstantsin Shautsou @@ -28,14 +35,38 @@ public class UpdateContainerCmdImpl extends AbstrDockerCmd blkioWeightDevice; + + @JsonProperty("BlkioDeviceReadBps") + private List blkioDeviceReadBps; + + @JsonProperty("BlkioDeviceWriteBps") + private List blkioDeviceWriteBps; + + @JsonProperty("BlkioDeviceReadIOps") + private List blkioDeviceReadIOps; + + @JsonProperty("BlkioDeviceWriteIOps") + private List blkioDeviceWriteIOps; + @JsonProperty("CpuShares") private Integer cpuShares; @JsonProperty("CpuPeriod") - private Integer cpuPeriod; + private Long cpuPeriod; @JsonProperty("CpuQuota") - private Integer cpuQuota; + private Long cpuQuota; + + @JsonProperty("CpuRealtimePeriod") + private Long cpuRealtimePeriod; + + @JsonProperty("CpuRealtimeRuntime") + private Long cpuRealtimeRuntime; + + @JsonProperty("NanoCpus") + private Long nanoCPUs; @JsonProperty("CpusetCpus") private String cpusetCpus; @@ -43,6 +74,18 @@ public class UpdateContainerCmdImpl extends AbstrDockerCmd devices; + + @JsonProperty("DeviceCgroupRules") + private List deviceCgroupRules; + + /** + * @since {@link com.github.dockerjava.core.RemoteApiVersion#VERSION_1_40} + */ + @JsonProperty("DeviceRequests") + private List deviceRequests; + @JsonProperty("Memory") private Long memory; @@ -55,11 +98,43 @@ public class UpdateContainerCmdImpl extends AbstrDockerCmd ulimits; + + @JsonProperty("RestartPolicy") + private RestartPolicy restartPolicy; + public UpdateContainerCmdImpl(UpdateContainerCmd.Exec exec, String containerId) { super(exec); withContainerId(containerId); } + /** + * @see #containerId + */ + @CheckForNull + @JsonIgnore + public String getContainerId() { + return containerId; + } + + /** + * @see #containerId + */ + public UpdateContainerCmd withContainerId(@Nonnull String containerId) { + this.containerId = containerId; + return this; + } + /** * @see #blkioWeight */ @@ -77,19 +152,68 @@ public UpdateContainerCmd withBlkioWeight(Integer blkioWeight) { } /** - * @see #containerId + * @see #blkioWeightDevice */ @CheckForNull - @JsonIgnore - public String getContainerId() { - return containerId; + public List getBlkioWeightDevice() { + return blkioWeightDevice; + } + + public UpdateContainerCmd withBlkioWeightDevice(List blkioWeightDevice) { + this.blkioWeightDevice = blkioWeightDevice; + return this; } /** - * @see #containerId + * @see #blkioDeviceReadBps */ - public UpdateContainerCmd withContainerId(@Nonnull String containerId) { - this.containerId = containerId; + @CheckForNull + public List getBlkioDeviceReadBps() { + return blkioDeviceReadBps; + } + + public UpdateContainerCmd withBlkioDeviceReadBps(List blkioDeviceReadBps) { + this.blkioDeviceReadBps = blkioDeviceReadBps; + return this; + } + + /** + * @see #blkioDeviceWriteBps + */ + @CheckForNull + public List getBlkioDeviceWriteBps() { + return blkioDeviceWriteBps; + } + + public UpdateContainerCmd withBlkioDeviceWriteBps(List blkioDeviceWriteBps) { + this.blkioDeviceWriteBps = blkioDeviceWriteBps; + return this; + } + + /** + * @see #blkioDeviceReadIOps + */ + @CheckForNull + public List getBlkioDeviceReadIOps() { + return blkioDeviceReadIOps; + } + + public UpdateContainerCmd withBlkioDeviceReadIOps(List blkioDeviceReadIOps) { + this.blkioDeviceReadIOps = blkioDeviceReadIOps; + return this; + } + + /** + * @see #blkioDeviceWriteIOps + */ + @CheckForNull + public List getBlkioDeviceWriteIOps() { + return blkioDeviceWriteIOps; + } + + @Override + public UpdateContainerCmd withBlkioDeviceWriteIOps(List blkioDeviceWriteIOps) { + this.blkioDeviceWriteIOps = blkioDeviceWriteIOps; return this; } @@ -97,14 +221,14 @@ public UpdateContainerCmd withContainerId(@Nonnull String containerId) { * @see #cpuPeriod */ @CheckForNull - public Integer getCpuPeriod() { + public Long getCpuPeriod() { return cpuPeriod; } /** * @see #cpuPeriod */ - public UpdateContainerCmd withCpuPeriod(Integer cpuPeriod) { + public UpdateContainerCmd withCpuPeriod(Long cpuPeriod) { this.cpuPeriod = cpuPeriod; return this; } @@ -113,14 +237,14 @@ public UpdateContainerCmd withCpuPeriod(Integer cpuPeriod) { * @see #cpuQuota */ @CheckForNull - public Integer getCpuQuota() { + public Long getCpuQuota() { return cpuQuota; } /** * @see #cpuQuota */ - public UpdateContainerCmd withCpuQuota(Integer cpuQuota) { + public UpdateContainerCmd withCpuQuota(Long cpuQuota) { this.cpuQuota = cpuQuota; return this; } @@ -173,6 +297,71 @@ public UpdateContainerCmd withCpuShares(Integer cpuShares) { return this; } + /** + * @see #cpuRealtimePeriod + */ + @CheckForNull + public Long getCpuRealtimePeriod() { + return cpuRealtimePeriod; + } + + public UpdateContainerCmd withCpuRealtimePeriod(Long cpuRealtimePeriod) { + this.cpuRealtimePeriod = cpuRealtimePeriod; + return this; + } + + /** + * @see #cpuRealtimeRuntime + */ + @CheckForNull + public Long getCpuRealtimeRuntime() { + return cpuRealtimeRuntime; + } + + public UpdateContainerCmd withCpuRealtimeRuntime(Long cpuRealtimeRuntime) { + this.cpuRealtimeRuntime = cpuRealtimeRuntime; + return this; + } + + /** + * @see #devices + */ + @CheckForNull + public List getDevices() { + return devices; + } + + public UpdateContainerCmd withDevices(List devices) { + this.devices = devices; + return this; + } + + /** + * @see #deviceCgroupRules + */ + @CheckForNull + public List getDeviceCgroupRules() { + return deviceCgroupRules; + } + + public UpdateContainerCmd withDeviceCgroupRules(List deviceCgroupRules) { + this.deviceCgroupRules = deviceCgroupRules; + return this; + } + + /** + * @see #deviceRequests + */ + @CheckForNull + public List getDeviceRequests() { + return deviceRequests; + } + + public UpdateContainerCmd withDeviceRequests(List deviceRequests) { + this.deviceRequests = deviceRequests; + return this; + } + /** * @see #kernelMemory */ @@ -237,6 +426,84 @@ public UpdateContainerCmd withMemorySwap(Long memorySwap) { return this; } + /** + * @see #nanoCPUs + */ + @CheckForNull + public Long getNanoCPUs() { + return nanoCPUs; + } + + public UpdateContainerCmd withNanoCPUs(Long nanoCPUs) { + this.nanoCPUs = nanoCPUs; + return this; + } + + /** + * @see #oomKillDisable + */ + @CheckForNull + public Boolean getOomKillDisable() { + return oomKillDisable; + } + + public UpdateContainerCmd withOomKillDisable(Boolean oomKillDisable) { + this.oomKillDisable = oomKillDisable; + return this; + } + + /** + * @see #init + */ + @CheckForNull + public Boolean getInit() { + return init; + } + + public UpdateContainerCmd withInit(Boolean init) { + this.init = init; + return this; + } + + /** + * @see #pidsLimit + */ + @CheckForNull + public Long getPidsLimit() { + return pidsLimit; + } + + public UpdateContainerCmd withPidsLimit(Long pidsLimit) { + this.pidsLimit = pidsLimit; + return this; + } + + /** + * @see #ulimits + */ + @CheckForNull + public List getUlimits() { + return ulimits; + } + + public UpdateContainerCmd withUlimits(List ulimits) { + this.ulimits = ulimits; + return this; + } + + /** + * @see #restartPolicy + */ + @CheckForNull + public RestartPolicy getRestartPolicy() { + return restartPolicy; + } + + public UpdateContainerCmd withRestartPolicy(RestartPolicy restartPolicy) { + this.restartPolicy = restartPolicy; + return this; + } + /** * @throws NotFoundException No such container */ diff --git a/docker-java/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java b/docker-java/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java index 0cf5141d4..23ef4b7f2 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/command/CommandJSONSamples.java @@ -28,7 +28,9 @@ public enum CommandJSONSamples implements JSONResourceRef { inspectContainerResponse_full_1_21, inspectContainerResponse_full_1_26a, inspectContainerResponse_full_1_26b, - inspectContainerResponse_empty; + inspectContainerResponse_empty, + updateContainerResponse_empty, + updateContainerResponse_warnings; @Override public String getFileName() { diff --git a/docker-java/src/test/java/com/github/dockerjava/api/command/UpdateContainerResponseTest.java b/docker-java/src/test/java/com/github/dockerjava/api/command/UpdateContainerResponseTest.java new file mode 100644 index 000000000..300a5c324 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/command/UpdateContainerResponseTest.java @@ -0,0 +1,33 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.model.UpdateContainerResponse; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static com.github.dockerjava.test.serdes.JSONTestHelper.testRoundTrip; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +public class UpdateContainerResponseTest { + @Test + public void roundTrip_empty() throws IOException { + UpdateContainerResponse response = testRoundTrip(CommandJSONSamples.updateContainerResponse_empty, UpdateContainerResponse.class); + assertNull(response.getWarnings()); + } + + @Test + public void roundTrip_warnings() throws IOException { + UpdateContainerResponse response = testRoundTrip(CommandJSONSamples.updateContainerResponse_warnings, + UpdateContainerResponse.class); + + List warnings = response.getWarnings(); + assertNotNull(warnings); + assertEquals(1, warnings.size()); + + final String warning = warnings.get(0); + assertEquals("Published ports are discarded when using host network mode", warning); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java index e5bb55499..e1e637809 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/UpdateContainerCmdIT.java @@ -48,8 +48,8 @@ public void updateContainer() throws DockerException { dockerRule.getClient().updateContainerCmd(containerId) .withBlkioWeight(300) .withCpuShares(512) - .withCpuPeriod(100000) - .withCpuQuota(50000) + .withCpuPeriod(100000L) + .withCpuQuota(50000L) // .withCpusetCpus("0") // depends on env .withCpusetMems("0") // .withMemory(209715200L + 2L) diff --git a/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_empty.json b/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_empty.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_empty.json @@ -0,0 +1 @@ +{} diff --git a/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_warnings.json b/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_warnings.json new file mode 100644 index 000000000..edeaedc7a --- /dev/null +++ b/docker-java/src/test/resources/com/github/dockerjava/api/command/updateContainerResponse_warnings.json @@ -0,0 +1,5 @@ +{ + "Warnings": [ + "Published ports are discarded when using host network mode" + ] +} From d9b653361df9ace172a65f5267a1a80907558ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 1 Apr 2025 14:43:32 -0600 Subject: [PATCH 064/137] Fix possible CME while replacing properties (#2416) Fixes #2274 --------- Co-authored-by: Torsten Krah --- .../dockerjava/core/DefaultDockerClientConfig.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java index 8011a2a5e..dad75b360 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java @@ -5,6 +5,8 @@ import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.NameParser.HostnameReposName; import com.github.dockerjava.core.NameParser.ReposTag; + +import java.util.Map.Entry; import java.util.Optional; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; @@ -128,9 +130,11 @@ private static Properties loadIncludedDockerProperties(Properties systemProperti } private static void replaceProperties(Properties properties, Properties replacements) { - for (Object objectKey : properties.keySet()) { - String key = objectKey.toString(); - properties.setProperty(key, replaceProperties(properties.getProperty(key), replacements)); + for (Entry entry : properties.entrySet()) { + final String key = entry.getKey().toString(); + // no entry.getValue here because it does not have the same semantics as getProperty (defaults handling) + final String value = properties.getProperty(key); + entry.setValue(replaceProperties(value, replacements)); } } From 2fa2eb51d0b21f0e4bc455a1f4e710b978b17272 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 14:55:07 -0600 Subject: [PATCH 065/137] Bump org.awaitility:awaitility from 4.0.1 to 4.3.0 (#2408) Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.0.1 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.0.1...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-version: 4.3.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java/pom.xml b/docker-java/pom.xml index de8cb9c88..e00c974d3 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -118,7 +118,7 @@ org.awaitility awaitility - 4.0.1 + 4.3.0 test From 5af2d3abf59bc50a8e551c74c482ac08ab201fc1 Mon Sep 17 00:00:00 2001 From: artragis Date: Tue, 1 Apr 2025 22:58:11 +0200 Subject: [PATCH 066/137] chore(deps): update guava so that it is not vulnerable (#2300) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: fdambrine Co-authored-by: Eddú Meléndez Gonzales --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8ec664b11..603b1ac48 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,7 @@ 1.80 2.10.1 - 19.0 + 33.4.6-jre 1.2.3 From 1f1e60d2efe2c495c3c43a59b4534d3316fb0b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 12 May 2025 19:14:20 -0500 Subject: [PATCH 067/137] Update ubuntu version to 24.04 (#2376) --- .github/workflows/ci.yml | 6 ++---- .github/workflows/release.yml | 2 +- .../com/github/dockerjava/cmd/CreateContainerCmdIT.java | 5 +++++ .../java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java | 8 ++++++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7aaef550..5d6f8d370 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ on: jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: @@ -15,7 +15,6 @@ jobs: - { name: "default", javaVersion: 8 } - { name: "default", javaVersion: 17 } - { name: "default", javaVersion: 21 } - - { name: "Docker 19.03.9", dockerVersion: "v19.03.9", javaVersion: 8 } steps: - uses: actions/checkout@v4 - name: Set up JDK @@ -27,7 +26,6 @@ jobs: id: setup_docker uses: docker/setup-docker-action@v4 with: - version: ${{matrix.dockerVersion}} channel: stable - name: Build with Maven env: @@ -35,7 +33,7 @@ jobs: run: ./mvnw --no-transfer-progress verify tcp: - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: Set up JDK diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1517a1167..3e9f64348 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: Set up JDK 8 diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java index de9f564e4..50623c029 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java @@ -34,7 +34,9 @@ import com.github.dockerjava.utils.TestUtils; import net.jcip.annotations.NotThreadSafe; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.SystemUtils; import org.junit.ClassRule; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -420,6 +422,7 @@ public void createContainerWithLink() throws DockerException { } @Test + @Ignore public void createContainerWithMemorySwappiness() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) .withCmd("sleep", "9999") @@ -959,6 +962,8 @@ public void onNext(Frame item) { @Test public void createContainerWithCgroupParent() throws DockerException { + assumeThat(!SystemUtils.IS_OS_LINUX, is(true)); + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") .withHostConfig(newHostConfig() .withCgroupParent("/parent")) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java index 87f35161c..36bcab840 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/swarm/SwarmCmdIT.java @@ -20,6 +20,8 @@ import org.junit.experimental.categories.Category; import java.io.IOException; +import java.time.Duration; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -36,7 +38,7 @@ public abstract class SwarmCmdIT extends CmdIT { private static final String DOCKER_IN_DOCKER_IMAGE_REPOSITORY = "docker"; - private static final String DOCKER_IN_DOCKER_IMAGE_TAG = "17.12-dind"; + private static final String DOCKER_IN_DOCKER_IMAGE_TAG = "26.1.3-dind"; private static final String DOCKER_IN_DOCKER_CONTAINER_PREFIX = "docker"; @@ -105,6 +107,8 @@ protected DockerClient startDockerInDocker() throws InterruptedException { ExposedPort exposedPort = ExposedPort.tcp(2375); CreateContainerResponse response = hostDockerClient .createContainerCmd(DOCKER_IN_DOCKER_IMAGE_REPOSITORY + ":" + DOCKER_IN_DOCKER_IMAGE_TAG) + .withEntrypoint("dockerd") + .withCmd(Arrays.asList("--host=tcp://0.0.0.0:2375", "--host=unix:///var/run/docker.sock", "--tls=false")) .withHostConfig(newHostConfig() .withNetworkMode(NETWORK_NAME) .withPortBindings(new PortBinding( @@ -125,7 +129,7 @@ protected DockerClient startDockerInDocker() throws InterruptedException { DockerClient dockerClient = initializeDockerClient(binding); - await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + await().pollDelay(Duration.ofSeconds(5)).atMost(10, TimeUnit.SECONDS).untilAsserted(() -> { dockerClient.pingCmd().exec(); }); From 33a58b6b54709bd67a2ee0ac8357fb9019661b2f Mon Sep 17 00:00:00 2001 From: Ian Sigmon <2955005+Sigmonia@users.noreply.github.com> Date: Mon, 12 May 2025 17:27:05 -0700 Subject: [PATCH 068/137] Parse prefixed Capability values (#2418) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../com/github/dockerjava/api/model/Capability.java | 10 +++++++++- .../github/dockerjava/api/model/CapabilityTest.java | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java index fe71864c0..57fb97c7b 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Capability.java @@ -1,5 +1,7 @@ package com.github.dockerjava.api.model; +import com.fasterxml.jackson.annotation.JsonCreator; + /** * The Linux capabilities supported by Docker. The list of capabilities is defined in Docker's types.go, {@link #ALL} was added manually. * @@ -299,5 +301,11 @@ public enum Capability { /** * Trigger something that will wake up the system (set CLOCK_REALTIME_ALARM and CLOCK_BOOTTIME_ALARM timers). */ - WAKE_ALARM + WAKE_ALARM; + + @JsonCreator + public static Capability fromValue(String cap) { + String result = !cap.startsWith("CAP_") ? cap : cap.split("_", 2)[1]; + return Capability.valueOf(result); + } } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java index aa6167b8c..b0652d945 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/CapabilityTest.java @@ -18,6 +18,9 @@ public void serializeCapability() throws Exception { public void deserializeCapability() throws Exception { Capability capability = JSONTestHelper.getMapper().readValue("\"ALL\"", Capability.class); assertEquals(Capability.ALL, capability); + + Capability compatibleCapability = JSONTestHelper.getMapper().readValue("\"CAP_ALL\"", Capability.class); + assertEquals(Capability.ALL, compatibleCapability); } @Test(expected = JsonMappingException.class) From 006c793dfff188a1b92dda943f77fbfc66bd11ec Mon Sep 17 00:00:00 2001 From: Simon Ohlsen <100684567+simohlsen@users.noreply.github.com> Date: Tue, 13 May 2025 02:32:08 +0200 Subject: [PATCH 069/137] Fix missing space in log (#2417) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../java/com/github/dockerjava/core/DockerClientBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java b/docker-java/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java index a3e4c3909..8100f285e 100644 --- a/docker-java/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java +++ b/docker-java/src/main/java/com/github/dockerjava/core/DockerClientBuilder.java @@ -94,7 +94,7 @@ public DockerClient build() { } else { Logger log = LoggerFactory.getLogger(DockerClientBuilder.class); log.warn( - "'dockerHttpClient' should be set." + + "'dockerHttpClient' should be set. " + "Falling back to Jersey, will be an error in future releases." ); From fc731d1da6b1dcc708e020783209b0f6839a4fc2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 19:53:09 -0500 Subject: [PATCH 070/137] Bump org.apache.httpcomponents.client5:httpclient5 from 5.4.3 to 5.4.4 (#2436) Bumps [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client) from 5.4.3 to 5.4.4. - [Changelog](https://github.com/apache/httpcomponents-client/blob/rel/v5.4.4/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.4.4) --- updated-dependencies: - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: 5.4.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-httpclient5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 0e82715e9..261922992 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -29,7 +29,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.3 + 5.4.4 From 5be7be7c344bd242670f74005c9e85bfe1c07f0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 19:53:43 -0500 Subject: [PATCH 071/137] Bump org.testcontainers:testcontainers from 1.19.1 to 1.21.0 (#2435) Bumps [org.testcontainers:testcontainers](https://github.com/testcontainers/testcontainers-java) from 1.19.1 to 1.21.0. - [Release notes](https://github.com/testcontainers/testcontainers-java/releases) - [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.19.1...1.21.0) --- updated-dependencies: - dependency-name: org.testcontainers:testcontainers dependency-version: 1.21.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 4d6dd5738..73161b458 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -46,7 +46,7 @@ org.testcontainers testcontainers - 1.19.1 + 1.21.0 From 7386eb82783b14842b54f0f4319dcadc0cf08893 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 19:53:59 -0500 Subject: [PATCH 072/137] Bump org.junit.jupiter:junit-jupiter from 5.12.1 to 5.12.2 (#2430) Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.12.1 to 5.12.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.12.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index 8bfd9e8d4..9a9c9f390 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -50,7 +50,7 @@ org.junit.jupiter junit-jupiter - 5.12.1 + 5.12.2 test From 89372695e59f207518aa2b24f29c3146b6aa5245 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 May 2025 20:48:36 -0500 Subject: [PATCH 073/137] Bump com.tngtech.archunit:archunit-junit5 from 0.18.0 to 1.4.1 (#2439) Bumps [com.tngtech.archunit:archunit-junit5](https://github.com/TNG/ArchUnit) from 0.18.0 to 1.4.1. - [Release notes](https://github.com/TNG/ArchUnit/releases) - [Commits](https://github.com/TNG/ArchUnit/compare/v0.18.0...v1.4.1) --- updated-dependencies: - dependency-name: com.tngtech.archunit:archunit-junit5 dependency-version: 1.4.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index 9a9c9f390..d801546c0 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -57,7 +57,7 @@ com.tngtech.archunit archunit-junit5 - 0.18.0 + 1.4.1 test From 20f08311d1613d8819c4548f34046b0557a43117 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 May 2025 20:49:03 -0500 Subject: [PATCH 074/137] Bump com.google.guava:guava from 33.4.6-jre to 33.4.8-jre (#2429) Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.4.6-jre to 33.4.8-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-version: 33.4.8-jre dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 603b1ac48..4acf4e175 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,7 @@ 1.80 2.10.1 - 33.4.6-jre + 33.4.8-jre 1.2.3 From 7fabc1b21a840fb512b1249fbc795b9d05fe8c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 25 Jun 2025 11:12:02 -0600 Subject: [PATCH 075/137] Switch to Sonatype Central Publishing Portal --- .github/workflows/release.yml | 12 +++++++----- pom.xml | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3e9f64348..16777daa6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,15 +16,17 @@ jobs: with: java-version: 8 distribution: temurin - server-id: default + server-id: central server-username: MAVEN_USERNAME server-password: MAVEN_CENTRAL_TOKEN + gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Set version run: ./mvnw versions:set -DnewVersion="${{github.event.release.tag_name}}" # TODO check main's CI status - name: Deploy with Maven env: - MAVEN_DEPLOYMENT_REPOSITORY: ${{ secrets.MAVEN_DEPLOYMENT_REPOSITORY }} - MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} - MAVEN_CENTRAL_TOKEN: ${{ secrets.OSSRH_PASSWORD }} - run: ./mvnw deploy -DaltReleaseDeploymentRepository="$MAVEN_DEPLOYMENT_REPOSITORY" -DskipTests + MAVEN_USERNAME: ${{ secrets.SONATYPE_CENTRAL_USERNAME }} + MAVEN_CENTRAL_TOKEN: ${{ secrets.SONATYPE_CENTRAL_PASSWORD }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + run: ./mvnw -Prelease deploy -DskipTests diff --git a/pom.xml b/pom.xml index 4acf4e175..fee54253a 100644 --- a/pom.xml +++ b/pom.xml @@ -286,6 +286,16 @@ + + org.sonatype.central + central-publishing-maven-plugin + 0.8.0 + true + + central + docker-java-transport-tck + + @@ -297,6 +307,9 @@ org.apache.maven.plugins maven-javadoc-plugin + + org.sonatype.central + central-publishing-maven-plugin @@ -308,6 +321,13 @@ org.apache.maven.plugins maven-gpg-plugin + + + + --pinentry-mode + loopback + + sign-artifacts From 0d7db3527e1b69b6859f2cfe7b3065e6782250b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 25 Jun 2025 11:37:13 -0600 Subject: [PATCH 076/137] Disable ExecStartCmdIT#execStartWithNonExistentUser --- .../src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java index cf096aa26..fc111f0e2 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ExecStartCmdIT.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.core.command.ExecStartResultCallback; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -77,6 +78,7 @@ public void execStartAttached() throws Exception { assertTrue(responseAsString.length() > 0); } + @Ignore @Test(expected = NotFoundException.class) public void execStartWithNonExistentUser() throws Exception { String containerName = "generated_" + new SecureRandom().nextInt(); From 5b0c7e89380462c847298132d1cdb593a661b943 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 11:52:49 -0600 Subject: [PATCH 077/137] Bump org.testcontainers:testcontainers from 1.21.0 to 1.21.2 (#2463) Bumps [org.testcontainers:testcontainers](https://github.com/testcontainers/testcontainers-java) from 1.21.0 to 1.21.2. - [Release notes](https://github.com/testcontainers/testcontainers-java/releases) - [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.21.0...1.21.2) --- updated-dependencies: - dependency-name: org.testcontainers:testcontainers dependency-version: 1.21.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 73161b458..a05ac5d9a 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -46,7 +46,7 @@ org.testcontainers testcontainers - 1.21.0 + 1.21.2 From 0d4638ab40c8bdb2da26659c85054b70106e01b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 11:53:04 -0600 Subject: [PATCH 078/137] Bump org.junit.jupiter:junit-jupiter from 5.12.2 to 5.13.2 (#2462) Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.12.2 to 5.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.12.2...r5.13.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.2 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index d801546c0..0c9cde9ba 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -50,7 +50,7 @@ org.junit.jupiter junit-jupiter - 5.12.2 + 5.13.2 test From bcd0f88eef48954ee133571bb6525b977a0d89fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 11:53:15 -0600 Subject: [PATCH 079/137] Bump org.bouncycastle:bcpkix-jdk18on from 1.80 to 1.81 (#2455) Bumps [org.bouncycastle:bcpkix-jdk18on](https://github.com/bcgit/bc-java) from 1.80 to 1.81. - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) --- updated-dependencies: - dependency-name: org.bouncycastle:bcpkix-jdk18on dependency-version: '1.81' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fee54253a..d0b9df2ec 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 3.17.0 1.7.30 - 1.80 + 1.81 2.10.1 33.4.8-jre From 1ece58adbfa3432ec910f53deae61ce274b64488 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:19:32 -0600 Subject: [PATCH 080/137] Bump org.apache.httpcomponents.client5:httpclient5 from 5.4.4 to 5.5 (#2445) Bumps [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client) from 5.4.4 to 5.5. - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.4...rel/v5.5) --- updated-dependencies: - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-httpclient5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 261922992..872c28e40 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -29,7 +29,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.4 + 5.5 From da24f1953d3eaa64ce7eddcdc0fa28747e4498db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:19:45 -0600 Subject: [PATCH 081/137] Bump netty.version from 4.1.119.Final to 4.2.2.Final (#2454) Bumps `netty.version` from 4.1.119.Final to 4.2.2.Final. Updates `io.netty:netty-codec-http` from 4.1.119.Final to 4.2.2.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.119.Final...netty-4.2.2.Final) Updates `io.netty:netty-handler` from 4.1.119.Final to 4.2.2.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.119.Final...netty-4.2.2.Final) Updates `io.netty:netty-handler-proxy` from 4.1.119.Final to 4.2.2.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.119.Final...netty-4.2.2.Final) Updates `io.netty:netty-transport-native-epoll` from 4.1.119.Final to 4.2.2.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.119.Final...netty-4.2.2.Final) Updates `io.netty:netty-transport-native-kqueue` from 4.1.119.Final to 4.2.2.Final - [Commits](https://github.com/netty/netty/compare/netty-4.1.119.Final...netty-4.2.2.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-version: 4.2.2.Final dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.netty:netty-handler dependency-version: 4.2.2.Final dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.netty:netty-handler-proxy dependency-version: 4.2.2.Final dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.netty:netty-transport-native-epoll dependency-version: 4.2.2.Final dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.netty:netty-transport-native-kqueue dependency-version: 4.2.2.Final dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d0b9df2ec..48de3acfe 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,7 @@ 1.2.3 - 4.1.119.Final + 4.2.2.Final 2.2 1.8 2.3.3 From e17e11e716b13b63b492f44e048e4f8ddda9f586 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:24:21 -0600 Subject: [PATCH 082/137] Bump commons-io:commons-io from 2.18.0 to 2.19.0 (#2428) Bumps commons-io:commons-io from 2.18.0 to 2.19.0. --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-version: 2.19.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 48de3acfe..38a999f79 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 2.18.3 4.5.12 1.27.1 - 2.18.0 + 2.19.0 3.17.0 1.7.30 From 05ac7d7e52e5e43cb7101ee81a73871596f3ed36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Jul 2025 09:38:19 -0600 Subject: [PATCH 083/137] Bump org.testcontainers:testcontainers from 1.21.2 to 1.21.3 (#2467) Bumps [org.testcontainers:testcontainers](https://github.com/testcontainers/testcontainers-java) from 1.21.2 to 1.21.3. - [Release notes](https://github.com/testcontainers/testcontainers-java/releases) - [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.21.2...1.21.3) --- updated-dependencies: - dependency-name: org.testcontainers:testcontainers dependency-version: 1.21.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index a05ac5d9a..654ad17b8 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -46,7 +46,7 @@ org.testcontainers testcontainers - 1.21.2 + 1.21.3 From dfb97962a5c378573988e7aedb9f20525673c2a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 1 Jul 2025 12:54:47 -0600 Subject: [PATCH 084/137] Drop jackson-jaxrs-json-provider dependency (#2468) --- docker-java-transport-jersey/pom.xml | 5 ----- pom.xml | 1 - 2 files changed, 6 deletions(-) diff --git a/docker-java-transport-jersey/pom.xml b/docker-java-transport-jersey/pom.xml index fbef13f1e..a600c208d 100644 --- a/docker-java-transport-jersey/pom.xml +++ b/docker-java-transport-jersey/pom.xml @@ -26,11 +26,6 @@ ${project.version} - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - ${jackson-jaxrs.version} - org.glassfish.jersey.connectors jersey-apache-connector diff --git a/pom.xml b/pom.xml index 38a999f79..022451fbe 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,6 @@ 2.30.1 2.18.3 - 2.18.3 4.5.12 1.27.1 2.19.0 From 9ccbd8fdfc85be619c2f012f9d041fe932dd588f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= <51929176+emirhandurmus@users.noreply.github.com> Date: Fri, 4 Jul 2025 16:31:33 +0300 Subject: [PATCH 085/137] Add Annotations option to HostConfig (#2422) --- .../dockerjava/api/model/HostConfig.java | 13 ++++++++ .../dockerjava/cmd/CreateContainerCmdIT.java | 32 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HostConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HostConfig.java index 2ad622ca6..603bc6347 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/HostConfig.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/HostConfig.java @@ -73,6 +73,9 @@ public static HostConfig newHostConfig() { @JsonProperty("NanoCpus") private Long nanoCPUs; + @JsonProperty("Annotations") + private Map annotations; + @JsonProperty("CapAdd") private Capability[] capAdd; @@ -304,6 +307,11 @@ public Integer getBlkioWeight() { return blkioWeight; } + @CheckForNull + public Map getAnnotations() { + return annotations; + } + public Capability[] getCapAdd() { return capAdd; } @@ -636,6 +644,11 @@ public HostConfig withBlkioWeightDevice(List blkioWeightDevic return this; } + public HostConfig withAnnotations(Map annotations) { + this.annotations = annotations; + return this; + } + /** * @see #capAdd */ diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java index 50623c029..d91791cbc 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java @@ -10,6 +10,8 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.DockerException; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.api.exception.InternalServerErrorException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.AuthConfig; @@ -58,6 +60,7 @@ import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_23; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_24; +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_43; import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static com.github.dockerjava.junit.DockerMatchers.mountedVolumes; import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE; @@ -1141,4 +1144,33 @@ public void shouldHandleANetworkAliasWithoutACustomNetworkGracefully() { .withCmd("sleep", "9999") .exec(); } + + @Test + public void createContainerWithAnnotations() throws DockerException { + DefaultDockerClientConfig forcedConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withApiVersion(VERSION_1_43) + .withRegistryUrl("https://index.docker.io/v1/") + .build(); + + DockerClient forcedClient = CmdIT.createDockerClient(forcedConfig); + Map annotations = new HashMap<>(); + annotations.put("com.example.key1", "value1"); + annotations.put("com.example.key2", "value2"); + + CreateContainerResponse container = forcedClient.createContainerCmd(DEFAULT_IMAGE) + .withCmd("sleep", "9999") + .withHostConfig(newHostConfig() + .withAnnotations(annotations)) + .exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(is(emptyString()))); + + InspectContainerResponse inspectContainerResponse = forcedClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(inspectContainerResponse.getHostConfig().getAnnotations(), equalTo(annotations)); + assertThat(inspectContainerResponse.getHostConfig().getAnnotations().get("com.example.key1"), equalTo("value1")); + assertThat(inspectContainerResponse.getHostConfig().getAnnotations().get("com.example.key2"), equalTo("value2")); + } } From b1d9e9155257d848b8d790a68ed407d4a8233d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 7 Jul 2025 08:55:34 -0600 Subject: [PATCH 086/137] Ignore jackson minor version updates --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d301147be..f0541701a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,3 +7,6 @@ updates: day: tuesday open-pull-requests-limit: 99 rebase-strategy: disabled + ignore: + - dependency-name: "com.fasterxml.jackson.core:*" + update-types: [ "version-update:semver-minor" ] From d9f2aad71ef0f0f02b6c14559474d7f337b4876e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 7 Jul 2025 11:36:52 -0600 Subject: [PATCH 087/137] Add deploymentName --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 022451fbe..acd77627d 100644 --- a/pom.xml +++ b/pom.xml @@ -293,6 +293,7 @@ central docker-java-transport-tck + com.github.docker-java From ad1e26a58c605e040ee989131e4c69c70018e38d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 11:40:46 -0600 Subject: [PATCH 088/137] Bump jackson.version from 2.18.3 to 2.18.4 (#2473) Bumps `jackson.version` from 2.18.3 to 2.18.4. Updates `com.fasterxml.jackson.core:jackson-annotations` from 2.18.3 to 2.18.4 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.18.4 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-annotations dependency-version: 2.18.4 dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.18.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java/pom.xml | 8 ++++---- pom.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docker-java/pom.xml b/docker-java/pom.xml index e00c974d3..f72d1d6c2 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -125,16 +125,16 @@ com.fasterxml.jackson.core jackson-databind - - 2.18.3 + + 2.18.4 test com.fasterxml.jackson.core jackson-annotations - - 2.18.3 + + 2.18.4 test diff --git a/pom.xml b/pom.xml index acd77627d..6cefe8d3b 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ 1.8 2.30.1 - 2.18.3 + 2.18.4 4.5.12 1.27.1 2.19.0 From 692ee29d34d363ab18b77b3e0fc9400d805e68ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=84=EC=84=B8=ED=98=81?= <164876765+sehyuk080101@users.noreply.github.com> Date: Thu, 17 Jul 2025 06:22:21 +0900 Subject: [PATCH 089/137] Fix typo 'deamon' to 'daemon' (#2476) --- circle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.sh b/circle.sh index c84ca3fe6..b5b7cdbb0 100755 --- a/circle.sh +++ b/circle.sh @@ -6,7 +6,7 @@ case "$1" in mkdir .docker cp $CIRCLE_PROJECT_REPONAME/etc/certs/* .docker - # configure docker deamon to use SSL and provide the path to the certificates + # configure docker daemon to use SSL and provide the path to the certificates docker_opts='DOCKER_OPTS="$DOCKER_OPTS -H tcp://127.0.0.1:2376 --tlsverify --tlscacert='$HOME'/.docker/ca.pem --tlscert='$HOME'/.docker/server-cert.pem --tlskey='$HOME'/.docker/server-key.pem"' sudo sh -c "echo '$docker_opts' >> /etc/default/docker" From 8762fe8616320f4f68802757af41c60088ccae48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:22:41 -0600 Subject: [PATCH 090/137] Bump org.apache.commons:commons-lang3 from 3.17.0 to 3.18.0 (#2478) Bumps org.apache.commons:commons-lang3 from 3.17.0 to 3.18.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-version: 3.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6cefe8d3b..3ea1afce3 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 4.5.12 1.27.1 2.19.0 - 3.17.0 + 3.18.0 1.7.30 1.81 From 64324e194d9c388521f4812a382f5315e403cb7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:22:53 -0600 Subject: [PATCH 091/137] Bump netty.version from 4.2.2.Final to 4.2.3.Final (#2477) Bumps `netty.version` from 4.2.2.Final to 4.2.3.Final. Updates `io.netty:netty-codec-http` from 4.2.2.Final to 4.2.3.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.2.Final...netty-4.2.3.Final) Updates `io.netty:netty-handler` from 4.2.2.Final to 4.2.3.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.2.Final...netty-4.2.3.Final) Updates `io.netty:netty-handler-proxy` from 4.2.2.Final to 4.2.3.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.2.Final...netty-4.2.3.Final) Updates `io.netty:netty-transport-native-epoll` from 4.2.2.Final to 4.2.3.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.2.Final...netty-4.2.3.Final) Updates `io.netty:netty-transport-native-kqueue` from 4.2.2.Final to 4.2.3.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.2.Final...netty-4.2.3.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-version: 4.2.3.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler dependency-version: 4.2.3.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler-proxy dependency-version: 4.2.3.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-epoll dependency-version: 4.2.3.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-kqueue dependency-version: 4.2.3.Final dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3ea1afce3..d3eab7db7 100644 --- a/pom.xml +++ b/pom.xml @@ -71,7 +71,7 @@ 1.2.3 - 4.2.2.Final + 4.2.3.Final 2.2 1.8 2.3.3 From b5597dde3f00ee2ee32b1c137c04b1dfedf184bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:23:14 -0600 Subject: [PATCH 092/137] Bump org.junit.jupiter:junit-jupiter from 5.13.2 to 5.13.3 (#2469) Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.13.2 to 5.13.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.2...r5.13.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index 0c9cde9ba..c5da3a385 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -50,7 +50,7 @@ org.junit.jupiter junit-jupiter - 5.13.2 + 5.13.3 test From a187d8274f452c14a14b952444005ca76d081527 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 10:42:43 -0600 Subject: [PATCH 093/137] Bump org.junit.jupiter:junit-jupiter from 5.13.3 to 5.13.4 (#2482) Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.13.3 to 5.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r5.13.4) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index c5da3a385..aafe5cde0 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -50,7 +50,7 @@ org.junit.jupiter junit-jupiter - 5.13.3 + 5.13.4 test From 3d64d8d845f043eba4aa58448ec4c25fc757f2c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 10:43:43 -0600 Subject: [PATCH 094/137] Bump commons-io:commons-io from 2.19.0 to 2.20.0 (#2480) Bumps [commons-io:commons-io](https://github.com/apache/commons-io) from 2.19.0 to 2.20.0. - [Changelog](https://github.com/apache/commons-io/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-io/compare/rel/commons-io-2.19.0...rel/commons-io-2.20.0) --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d3eab7db7..df34bd07a 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 2.18.4 4.5.12 1.27.1 - 2.19.0 + 2.20.0 3.18.0 1.7.30 From af2a9472d4f4bc73a05adf27d111fa92762b398d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 30 Jul 2025 20:41:48 -0600 Subject: [PATCH 095/137] Revert "Ignore jackson minor version updates" This reverts commit b1d9e9155257d848b8d790a68ed407d4a8233d45. --- .github/dependabot.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f0541701a..d301147be 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,6 +7,3 @@ updates: day: tuesday open-pull-requests-limit: 99 rebase-strategy: disabled - ignore: - - dependency-name: "com.fasterxml.jackson.core:*" - update-types: [ "version-update:semver-minor" ] From 9c40b40d59526981ee89c0043f5820402a0b67a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Jul 2025 10:13:10 -0600 Subject: [PATCH 096/137] Bump jackson.version from 2.18.4 to 2.19.2 (#2485) Bumps `jackson.version` from 2.18.4 to 2.19.2. Updates `com.fasterxml.jackson.core:jackson-annotations` from 2.18.4 to 2.19.2 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.4 to 2.19.2 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-annotations dependency-version: 2.19.2 dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.2 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java/pom.xml | 8 ++++---- pom.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docker-java/pom.xml b/docker-java/pom.xml index f72d1d6c2..f1cc09f64 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -125,16 +125,16 @@ com.fasterxml.jackson.core jackson-databind - - 2.18.4 + + 2.19.2 test com.fasterxml.jackson.core jackson-annotations - - 2.18.4 + + 2.19.2 test diff --git a/pom.xml b/pom.xml index df34bd07a..9122d5bda 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ 1.8 2.30.1 - 2.18.4 + 2.19.2 4.5.12 1.27.1 2.20.0 From 464c112003eb1b7e0d42aac8fbfb3af038ba18b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 19 Aug 2025 12:20:11 -0600 Subject: [PATCH 097/137] Ignore major update for jersey --- .github/dependabot.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d301147be..43fe26c4d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,3 +7,10 @@ updates: day: tuesday open-pull-requests-limit: 99 rebase-strategy: disabled + ignore: + - dependency-name: "org.glassfish.jersey.connectors:jersey-apache-connector" + update-types: [ "version-update:semver-major" ] + - dependency-name: "org.glassfish.jersey.core:jersey-client" + update-types: [ "version-update:semver-major" ] + - dependency-name: "org.glassfish.jersey.inject:jersey-hk2" + update-types: [ "version-update:semver-major" ] From 39743d1b633f79e882c0ab994f3cc6be389efa8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 12:25:39 -0600 Subject: [PATCH 098/137] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 (#2489) Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 654ad17b8..69d40cc3c 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -34,7 +34,7 @@ org.assertj assertj-core - 3.27.3 + 3.27.4 From 718fc382cb1923ce434c4f77c927cd6806f45a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 19 Aug 2025 15:17:25 -0600 Subject: [PATCH 099/137] Add cache for maven --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d6f8d370..d7b105d1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,6 +22,7 @@ jobs: with: java-version: ${{matrix.javaVersion}} distribution: temurin + cache: maven - name: Configure Docker id: setup_docker uses: docker/setup-docker-action@v4 @@ -41,6 +42,7 @@ jobs: with: java-version: 8 distribution: temurin + cache: maven - name: Configure Docker id: setup_docker uses: docker/setup-docker-action@v4 From 95d0fa703bf81fb20648a794e31b410216e6d5be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 19 Aug 2025 15:21:33 -0600 Subject: [PATCH 100/137] Switch dependabot to daily --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 43fe26c4d..9bcef2d88 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,7 +4,7 @@ updates: directory: "/" schedule: interval: weekly - day: tuesday + day: monday open-pull-requests-limit: 99 rebase-strategy: disabled ignore: From 9165f4191c5c52fce24c57665fd8007f4d902605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 19 Aug 2025 15:25:48 -0600 Subject: [PATCH 101/137] Update name-template in release-drafter --- .github/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index d03b3f5f5..f570cce43 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -1,5 +1,5 @@ tag-template: $NEXT_PATCH_VERSION -name-template: '$NEXT_PATCH_VERSION 🌈' +name-template: '$NEXT_PATCH_VERSION' categories: - title: '🚀 Features' labels: From dfe1866d956f64fd4b91834f9b09ee973ac1f270 Mon Sep 17 00:00:00 2001 From: Alexander Koshevoy <11692026+tejksat@users.noreply.github.com> Date: Tue, 19 Aug 2025 23:53:58 +0200 Subject: [PATCH 102/137] Add support for container wait conditions (#2487) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expose the `condition` query parameter (added in Docker Engine API v1.30) on `WaitContainerCmd`. When the parameter is omitted, we keep the daemon’s default `not-running` behaviour. Practical implications ---------------------- * **create → wait (no condition) → start** Calling `wait` right after `create` but **before** `start` returns immediately with whatever exit-code the daemon reports for a container that has never run (typically `0`). In other words, you learn nothing about the future process. * **create → start → wait (no condition)** For short-lived containers started with `--rm`, the container may be auto-removed before the client manages to issue `wait`, resulting in a *"container not found"* error. * **create → wait(condition=removed) → start** Passing the new `removed` condition eliminates both races: the wait call blocks until the container has exited *and* been removed, reliably yielding the actual exit code even for `--rm` containers. --- .../api/command/WaitContainerCmd.java | 18 ++++- .../api/model/WaitContainerCondition.java | 26 ++++++ .../core/command/WaitContainerCmdImpl.java | 17 ++++ .../core/exec/WaitContainerCmdExec.java | 6 ++ .../dockerjava/cmd/WaitContainerCmdIT.java | 80 +++++++++++++++++++ 5 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 docker-java-api/src/main/java/com/github/dockerjava/api/model/WaitContainerCondition.java diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java index 3117cf7e4..7b910cd69 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/WaitContainerCmd.java @@ -2,9 +2,11 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.WaitContainerCondition; import com.github.dockerjava.api.model.WaitResponse; /** @@ -20,8 +22,20 @@ public interface WaitContainerCmd extends AsyncDockerCmd> T exec(T resultCallback); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/WaitContainerCondition.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/WaitContainerCondition.java new file mode 100644 index 000000000..8af0efa35 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/WaitContainerCondition.java @@ -0,0 +1,26 @@ +package com.github.dockerjava.api.model; + +import javax.annotation.Nonnull; + +/** + * Docker Engine API wait conditions (added in v1.30). + * + * @since {@link RemoteApiVersion#VERSION_1_30} + */ +public enum WaitContainerCondition { + NOT_RUNNING("not-running"), + NEXT_EXIT("next-exit"), + REMOVED("removed"); + + @Nonnull + private final String value; + + WaitContainerCondition(@Nonnull String value) { + this.value = value; + } + + @Nonnull + public String getValue() { + return value; + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java index 91b2255bc..b627e2ccd 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/WaitContainerCmdImpl.java @@ -2,7 +2,10 @@ import java.util.Objects; +import javax.annotation.Nullable; + import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.api.model.WaitContainerCondition; import com.github.dockerjava.api.model.WaitResponse; /** @@ -15,6 +18,8 @@ public class WaitContainerCmdImpl extends AbstrAsyncDockerCmd r WebTarget webTarget = getBaseResource().path("/containers/{id}/wait").resolveTemplate("id", command.getContainerId()); + WaitContainerCondition condition = command.getCondition(); + if (condition != null) { + webTarget = webTarget.queryParam("condition", condition.getValue()); + } + LOGGER.trace("POST: {}", webTarget); webTarget.request().accept(MediaType.APPLICATION_JSON).post((Object) null, new TypeReference() { diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/WaitContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/WaitContainerCmdIT.java index e2ad2a643..3a39b3eea 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/WaitContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/WaitContainerCmdIT.java @@ -8,18 +8,25 @@ import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.WaitContainerCondition; import com.github.dockerjava.api.model.WaitResponse; +import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.TimeUnit; +import static com.github.dockerjava.api.model.HostConfig.newHostConfig; +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_25; +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_30; +import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.emptyString; import static org.hamcrest.Matchers.not; +import static org.junit.Assume.assumeThat; public class WaitContainerCmdIT extends CmdIT { public static final Logger LOG = LoggerFactory.getLogger(BuildImageCmd.class); @@ -102,4 +109,77 @@ public void testWaitContainerTimeout() { LOG.info(e.getMessage()); } } + + @Test + public void testWaitNotStartedContainer() { + assumeThat("API version should be > 1.25", dockerRule, isGreaterOrEqual(VERSION_1_25)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withHostConfig(newHostConfig().withAutoRemove(true)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + + WaitContainerResultCallback callback = dockerRule.getClient().waitContainerCmd(container.getId()).exec(new WaitContainerResultCallback()); + + Integer statusCode = callback.awaitStatusCode(100, TimeUnit.MILLISECONDS); + Assert.assertEquals(0, statusCode.intValue()); + } + + @Test + public void testWaitContainerWithAutoRemoval() { + assumeThat("API version should be > 1.30", dockerRule, isGreaterOrEqual(VERSION_1_30)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("false") + .withHostConfig(newHostConfig().withAutoRemove(true)) + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + + WaitContainerResultCallback removedCondition = dockerRule.getClient().waitContainerCmd(container.getId()) + .withCondition(WaitContainerCondition.REMOVED) + .exec(new WaitContainerResultCallback()); + + WaitContainerResultCallback nextExitCondition = dockerRule.getClient().waitContainerCmd(container.getId()) + .withCondition(WaitContainerCondition.NEXT_EXIT) + .exec(new WaitContainerResultCallback()); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + Assert.assertEquals(1, removedCondition.awaitStatusCode(100, TimeUnit.MILLISECONDS).intValue()); + Assert.assertEquals(1, nextExitCondition.awaitStatusCode(100, TimeUnit.MILLISECONDS).intValue()); + } + + @Test + public void testWaitRestartedContainer() { + assumeThat("API version should be > 1.30", dockerRule, isGreaterOrEqual(VERSION_1_30)); + + CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") + .withCmd("sh", "-c", "[ -f \"$HOME/.first_run_marker\" ] && exit 2 || { touch \"$HOME/.first_run_marker\"; exit 1; }") + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + + WaitContainerResultCallback firstExitCallback = dockerRule.getClient().waitContainerCmd(container.getId()) + .withCondition(WaitContainerCondition.NEXT_EXIT) + .exec(new WaitContainerResultCallback()); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + Integer firstStatusCode = firstExitCallback.awaitStatusCode(100, TimeUnit.MILLISECONDS); + Assert.assertEquals(1, firstStatusCode.intValue()); + + WaitContainerResultCallback callback = dockerRule.getClient().waitContainerCmd(container.getId()) + .withCondition(WaitContainerCondition.NEXT_EXIT) + .exec(new WaitContainerResultCallback()); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + Integer statusCode = callback.awaitStatusCode(100, TimeUnit.MILLISECONDS); + Assert.assertEquals(2, statusCode.intValue()); + } } From ce05588c61724ad3b03350fd1556d413740257c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 18:25:33 -0600 Subject: [PATCH 103/137] Bump netty.version from 4.2.3.Final to 4.2.4.Final (#2494) Bumps `netty.version` from 4.2.3.Final to 4.2.4.Final. Updates `io.netty:netty-codec-http` from 4.2.3.Final to 4.2.4.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.3.Final...netty-4.2.4.Final) Updates `io.netty:netty-handler` from 4.2.3.Final to 4.2.4.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.3.Final...netty-4.2.4.Final) Updates `io.netty:netty-handler-proxy` from 4.2.3.Final to 4.2.4.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.3.Final...netty-4.2.4.Final) Updates `io.netty:netty-transport-native-epoll` from 4.2.3.Final to 4.2.4.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.3.Final...netty-4.2.4.Final) Updates `io.netty:netty-transport-native-kqueue` from 4.2.3.Final to 4.2.4.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.3.Final...netty-4.2.4.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-version: 4.2.4.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler dependency-version: 4.2.4.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler-proxy dependency-version: 4.2.4.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-epoll dependency-version: 4.2.4.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-kqueue dependency-version: 4.2.4.Final dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9122d5bda..83542af74 100644 --- a/pom.xml +++ b/pom.xml @@ -71,7 +71,7 @@ 1.2.3 - 4.2.3.Final + 4.2.4.Final 2.2 1.8 2.3.3 From 4df8cbb4d90d6d88378493d78a691342e95769ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 18:42:40 -0600 Subject: [PATCH 104/137] Bump jersey.version from 2.30.1 to 2.47 (#2496) Bumps `jersey.version` from 2.30.1 to 2.47. Updates `org.glassfish.jersey.connectors:jersey-apache-connector` from 2.30.1 to 2.47 Updates `org.glassfish.jersey.core:jersey-client` from 2.30.1 to 2.47 Updates `org.glassfish.jersey.inject:jersey-hk2` from 2.30.1 to 2.47 --- updated-dependencies: - dependency-name: org.glassfish.jersey.connectors:jersey-apache-connector dependency-version: '2.47' dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.glassfish.jersey.core:jersey-client dependency-version: '2.47' dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.glassfish.jersey.inject:jersey-hk2 dependency-version: '2.47' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 83542af74..fe10d4302 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.8 1.8 - 2.30.1 + 2.47 2.19.2 4.5.12 1.27.1 From 150293d945f34e54c562ac82a803fd738fed4be4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 18:58:21 -0600 Subject: [PATCH 105/137] Bump org.apache.commons:commons-compress from 1.27.1 to 1.28.0 (#2486) Bumps [org.apache.commons:commons-compress](https://github.com/apache/commons-compress) from 1.27.1 to 1.28.0. - [Changelog](https://github.com/apache/commons-compress/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-compress/compare/rel/commons-compress-1.27.1...rel/commons-compress-1.28.0) --- updated-dependencies: - dependency-name: org.apache.commons:commons-compress dependency-version: 1.28.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fe10d4302..58fa183e8 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 2.47 2.19.2 4.5.12 - 1.27.1 + 1.28.0 2.20.0 3.18.0 1.7.30 From 89a5188317df187727d9fcd7ec7bc617097e12bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 21:58:35 -0600 Subject: [PATCH 106/137] Bump org.bouncycastle:bcpkix-jdk18on from 1.81 to 1.82 (#2512) Bumps [org.bouncycastle:bcpkix-jdk18on](https://github.com/bcgit/bc-java) from 1.81 to 1.82. - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) --- updated-dependencies: - dependency-name: org.bouncycastle:bcpkix-jdk18on dependency-version: '1.82' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 58fa183e8..b800eb77f 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ 3.18.0 1.7.30 - 1.81 + 1.82 2.10.1 33.4.8-jre From fc44c4dcad1e930202c5c1b99dafffc3dc960d58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 21:58:46 -0600 Subject: [PATCH 107/137] Bump org.assertj:assertj-core from 3.27.4 to 3.27.5 (#2508) Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.4 to 3.27.5. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.4...assertj-build-3.27.5) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 69d40cc3c..2e24aed4c 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -34,7 +34,7 @@ org.assertj assertj-core - 3.27.4 + 3.27.5 From 9953383e48d2c8ba28a3487c8601688f5a1b1396 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 22:23:08 -0600 Subject: [PATCH 108/137] Bump netty.version from 4.2.4.Final to 4.2.6.Final (#2501) Bumps `netty.version` from 4.2.4.Final to 4.2.6.Final. Updates `io.netty:netty-codec-http` from 4.2.4.Final to 4.2.6.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.4.Final...netty-4.2.6.Final) Updates `io.netty:netty-handler` from 4.2.4.Final to 4.2.6.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.4.Final...netty-4.2.6.Final) Updates `io.netty:netty-handler-proxy` from 4.2.4.Final to 4.2.6.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.4.Final...netty-4.2.6.Final) Updates `io.netty:netty-transport-native-epoll` from 4.2.4.Final to 4.2.6.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.4.Final...netty-4.2.6.Final) Updates `io.netty:netty-transport-native-kqueue` from 4.2.4.Final to 4.2.6.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.4.Final...netty-4.2.6.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-version: 4.2.6.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler dependency-version: 4.2.6.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler-proxy dependency-version: 4.2.6.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-epoll dependency-version: 4.2.6.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-kqueue dependency-version: 4.2.6.Final dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b800eb77f..300b154a8 100644 --- a/pom.xml +++ b/pom.xml @@ -71,7 +71,7 @@ 1.2.3 - 4.2.4.Final + 4.2.6.Final 2.2 1.8 2.3.3 From 745c977b57ec2f2514e1c600c22ed97655dde9f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 17:03:55 -0600 Subject: [PATCH 109/137] Bump org.apache.httpcomponents.client5:httpclient5 from 5.5 to 5.5.1 (#2518) Bumps [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client) from 5.5 to 5.5.1. - [Changelog](https://github.com/apache/httpcomponents-client/blob/rel/v5.5.1/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.5...rel/v5.5.1) --- updated-dependencies: - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: 5.5.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-httpclient5/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 872c28e40..013aa63f7 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -29,7 +29,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.5 + 5.5.1 From ad0e3d2e54962772ae503a582eecc255c5251f14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 17:04:07 -0600 Subject: [PATCH 110/137] Bump org.sonatype.central:central-publishing-maven-plugin (#2517) Bumps [org.sonatype.central:central-publishing-maven-plugin](https://github.com/sonatype/central-publishing-maven-plugin) from 0.8.0 to 0.9.0. - [Commits](https://github.com/sonatype/central-publishing-maven-plugin/commits) --- updated-dependencies: - dependency-name: org.sonatype.central:central-publishing-maven-plugin dependency-version: 0.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 300b154a8..0ae416d1b 100644 --- a/pom.xml +++ b/pom.xml @@ -288,7 +288,7 @@ org.sonatype.central central-publishing-maven-plugin - 0.8.0 + 0.9.0 true central From 55e45932aa684291222e9e63a6512f232ac69b23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 17:04:28 -0600 Subject: [PATCH 111/137] Bump org.assertj:assertj-core from 3.27.5 to 3.27.6 (#2513) Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.5 to 3.27.6. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.5...assertj-build-3.27.6) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 2e24aed4c..a7a74101b 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -34,7 +34,7 @@ org.assertj assertj-core - 3.27.5 + 3.27.6 From 717152e854db314f8fc2ef6ee650db1ab54551e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ller?= Date: Wed, 1 Oct 2025 01:09:41 +0200 Subject: [PATCH 112/137] Support propagation modes rslave, rshared and rprivate in Bind.parse (#2519) Fixes #2271 --- .../com/github/dockerjava/api/model/Bind.java | 6 +++ .../github/dockerjava/api/model/BindTest.java | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java index a7c8dba26..ea7c22e69 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Bind.java @@ -118,10 +118,16 @@ public static Bind parse(String serialized) { nocopy = true; } else if (PropagationMode.SHARED.toString().equals(p)) { propagationMode = PropagationMode.SHARED; + } else if (PropagationMode.RSHARED.toString().equals(p)) { + propagationMode = PropagationMode.RSHARED; } else if (PropagationMode.SLAVE.toString().equals(p)) { propagationMode = PropagationMode.SLAVE; + } else if (PropagationMode.RSLAVE.toString().equals(p)) { + propagationMode = PropagationMode.RSLAVE; } else if (PropagationMode.PRIVATE.toString().equals(p)) { propagationMode = PropagationMode.PRIVATE; + } else if (PropagationMode.RPRIVATE.toString().equals(p)) { + propagationMode = PropagationMode.RPRIVATE; } else { seMode = SELContext.fromString(p); } diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java index 663231151..d31a66dde 100644 --- a/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/BindTest.java @@ -166,6 +166,17 @@ public void parseReadWriteShared() { assertThat(bind.getPropagationMode(), is(PropagationMode.SHARED)); } + @Test + public void parseReadWriteRshared() { + Bind bind = Bind.parse("/host:/container:rw,rshared"); + assertThat(bind.getPath(), is("/host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.RSHARED)); + } + @Test public void parseReadWriteSlave() { Bind bind = Bind.parse("/host:/container:rw,slave"); @@ -177,6 +188,17 @@ public void parseReadWriteSlave() { assertThat(bind.getPropagationMode(), is(PropagationMode.SLAVE)); } + @Test + public void parseReadWriteRslave() { + Bind bind = Bind.parse("/host:/container:rw,rslave"); + assertThat(bind.getPath(), is("/host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.RSLAVE)); + } + @Test public void parseReadWritePrivate() { Bind bind = Bind.parse("/host:/container:rw,private"); @@ -188,6 +210,17 @@ public void parseReadWritePrivate() { assertThat(bind.getPropagationMode(), is(PropagationMode.PRIVATE)); } + @Test + public void parseReadWriteRprivate() { + Bind bind = Bind.parse("/host:/container:rw,rprivate"); + assertThat(bind.getPath(), is("/host")); + assertThat(bind.getVolume().getPath(), is("/container")); + assertThat(bind.getAccessMode(), is(rw)); + assertThat(bind.getSecMode(), is(SELContext.none)); + assertThat(bind.getNoCopy(), nullValue()); + assertThat(bind.getPropagationMode(), is(PropagationMode.RPRIVATE)); + } + @Test public void parseReadOnly() { Bind bind = Bind.parse("/host:/container:ro"); @@ -284,16 +317,31 @@ public void toStringReadWriteShared() { assertThat(Bind.parse("/host:/container:rw,shared").toString(), is("/host:/container:rw,shared")); } + @Test + public void toStringReadWriteRshared() { + assertThat(Bind.parse("/host:/container:rw,rshared").toString(), is("/host:/container:rw,rshared")); + } + @Test public void toStringReadWriteSlave() { assertThat(Bind.parse("/host:/container:rw,slave").toString(), is("/host:/container:rw,slave")); } + @Test + public void toStringReadWriteRslave() { + assertThat(Bind.parse("/host:/container:rw,rslave").toString(), is("/host:/container:rw,rslave")); + } + @Test public void toStringReadWritePrivate() { assertThat(Bind.parse("/host:/container:rw,private").toString(), is("/host:/container:rw,private")); } + @Test + public void toStringReadWriteRprivate() { + assertThat(Bind.parse("/host:/container:rw,rprivate").toString(), is("/host:/container:rw,rprivate")); + } + @Test public void toStringDefaultAccessMode() { assertThat(Bind.parse("/host:/container").toString(), is("/host:/container:rw")); From 3a709b8844e2cb20b78e14b2183417aa67f94b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 30 Sep 2025 17:30:31 -0600 Subject: [PATCH 113/137] Manage jackson versions independently (#2520) --- docker-java-api/pom.xml | 2 +- docker-java-core/pom.xml | 2 +- pom.xml | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index aafe5cde0..c3e17887a 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -23,7 +23,7 @@ com.fasterxml.jackson.core jackson-annotations - ${jackson.version} + 2.19.2 diff --git a/docker-java-core/pom.xml b/docker-java-core/pom.xml index 290a1fed9..90fa3a813 100644 --- a/docker-java-core/pom.xml +++ b/docker-java-core/pom.xml @@ -58,7 +58,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + 2.19.2 diff --git a/pom.xml b/pom.xml index 0ae416d1b..fcd48b50a 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,6 @@ 1.8 2.47 - 2.19.2 4.5.12 1.28.0 2.20.0 From 4447932fef9c9e5de84249fe3c1b00c69186e359 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 17:56:28 -0600 Subject: [PATCH 114/137] Bump org.apache.commons:commons-lang3 from 3.18.0 to 3.19.0 (#2516) Bumps org.apache.commons:commons-lang3 from 3.18.0 to 3.19.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-version: 3.19.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fcd48b50a..8eb0a3ade 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 4.5.12 1.28.0 2.20.0 - 3.18.0 + 3.19.0 1.7.30 1.82 From 75829faa346d0ff98a31a52a1cfdfec8a58a9627 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 17:56:48 -0600 Subject: [PATCH 115/137] Bump net.java.dev.jna:jna from 5.17.0 to 5.18.0 (#2515) Bumps [net.java.dev.jna:jna](https://github.com/java-native-access/jna) from 5.17.0 to 5.18.0. - [Changelog](https://github.com/java-native-access/jna/blob/master/CHANGES.md) - [Commits](https://github.com/java-native-access/jna/compare/5.17.0...5.18.0) --- updated-dependencies: - dependency-name: net.java.dev.jna:jna dependency-version: 5.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-httpclient5/pom.xml | 2 +- docker-java-transport-okhttp/pom.xml | 2 +- docker-java-transport/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 013aa63f7..744676f81 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -35,7 +35,7 @@ net.java.dev.jna jna - 5.17.0 + 5.18.0 diff --git a/docker-java-transport-okhttp/pom.xml b/docker-java-transport-okhttp/pom.xml index 3bac0cead..c30e369a0 100644 --- a/docker-java-transport-okhttp/pom.xml +++ b/docker-java-transport-okhttp/pom.xml @@ -35,7 +35,7 @@ net.java.dev.jna jna - 5.17.0 + 5.18.0 diff --git a/docker-java-transport/pom.xml b/docker-java-transport/pom.xml index 96f1f850a..6a9e95270 100644 --- a/docker-java-transport/pom.xml +++ b/docker-java-transport/pom.xml @@ -37,7 +37,7 @@ net.java.dev.jna jna - 5.17.0 + 5.18.0 provided From 476b88b81929e5af0f59c10d1ac5d55b21abcc74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 18:01:16 -0600 Subject: [PATCH 116/137] Bump com.fasterxml.jackson.core:jackson-annotations from 2.19.2 to 2.20 (#2521) Bumps [com.fasterxml.jackson.core:jackson-annotations](https://github.com/FasterXML/jackson) from 2.19.2 to 2.20. - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-annotations dependency-version: '2.20' dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-api/pom.xml | 2 +- docker-java/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml index c3e17887a..dda682ab1 100644 --- a/docker-java-api/pom.xml +++ b/docker-java-api/pom.xml @@ -23,7 +23,7 @@ com.fasterxml.jackson.core jackson-annotations - 2.19.2 + 2.20 diff --git a/docker-java/pom.xml b/docker-java/pom.xml index f1cc09f64..b6f5c8564 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -133,8 +133,8 @@ com.fasterxml.jackson.core jackson-annotations - - 2.19.2 + + 2.20 test From 0873a609e55d4ff15a504b38c9a664fdc73322bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 09:24:06 -0600 Subject: [PATCH 117/137] Bump com.github.siom79.japicmp:japicmp-maven-plugin (#2529) Bumps [com.github.siom79.japicmp:japicmp-maven-plugin](https://github.com/siom79/japicmp) from 0.23.1 to 0.24.2. - [Release notes](https://github.com/siom79/japicmp/releases) - [Changelog](https://github.com/siom79/japicmp/blob/master/release.py) - [Commits](https://github.com/siom79/japicmp/compare/japicmp-base-0.23.1...japicmp-base-0.24.2) --- updated-dependencies: - dependency-name: com.github.siom79.japicmp:japicmp-maven-plugin dependency-version: 0.24.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8eb0a3ade..f8b0fe93c 100644 --- a/pom.xml +++ b/pom.xml @@ -242,7 +242,7 @@ com.github.siom79.japicmp japicmp-maven-plugin - 0.23.1 + 0.24.2 From 9c2ac260d18589807cfb7819dbabc0994af0e611 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:29:34 -0600 Subject: [PATCH 118/137] Bump netty.version from 4.2.6.Final to 4.2.7.Final (#2531) Bumps `netty.version` from 4.2.6.Final to 4.2.7.Final. Updates `io.netty:netty-codec-http` from 4.2.6.Final to 4.2.7.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.6.Final...netty-4.2.7.Final) Updates `io.netty:netty-handler` from 4.2.6.Final to 4.2.7.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.6.Final...netty-4.2.7.Final) Updates `io.netty:netty-handler-proxy` from 4.2.6.Final to 4.2.7.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.6.Final...netty-4.2.7.Final) Updates `io.netty:netty-transport-native-epoll` from 4.2.6.Final to 4.2.7.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.6.Final...netty-4.2.7.Final) Updates `io.netty:netty-transport-native-kqueue` from 4.2.6.Final to 4.2.7.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.6.Final...netty-4.2.7.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-version: 4.2.7.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler dependency-version: 4.2.7.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler-proxy dependency-version: 4.2.7.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-epoll dependency-version: 4.2.7.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-kqueue dependency-version: 4.2.7.Final dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f8b0fe93c..c7c05864c 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ 1.2.3 - 4.2.6.Final + 4.2.7.Final 2.2 1.8 2.3.3 From 0bc94c6b305412c39a4abf2b4c5c69a01b182641 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:30:02 -0600 Subject: [PATCH 119/137] Bump net.java.dev.jna:jna from 5.18.0 to 5.18.1 (#2524) Bumps [net.java.dev.jna:jna](https://github.com/java-native-access/jna) from 5.18.0 to 5.18.1. - [Changelog](https://github.com/java-native-access/jna/blob/master/CHANGES.md) - [Commits](https://github.com/java-native-access/jna/compare/5.18.0...5.18.1) --- updated-dependencies: - dependency-name: net.java.dev.jna:jna dependency-version: 5.18.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-httpclient5/pom.xml | 2 +- docker-java-transport-okhttp/pom.xml | 2 +- docker-java-transport/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-java-transport-httpclient5/pom.xml b/docker-java-transport-httpclient5/pom.xml index 744676f81..52cf66de2 100644 --- a/docker-java-transport-httpclient5/pom.xml +++ b/docker-java-transport-httpclient5/pom.xml @@ -35,7 +35,7 @@ net.java.dev.jna jna - 5.18.0 + 5.18.1 diff --git a/docker-java-transport-okhttp/pom.xml b/docker-java-transport-okhttp/pom.xml index c30e369a0..2a0ae4227 100644 --- a/docker-java-transport-okhttp/pom.xml +++ b/docker-java-transport-okhttp/pom.xml @@ -35,7 +35,7 @@ net.java.dev.jna jna - 5.18.0 + 5.18.1 diff --git a/docker-java-transport/pom.xml b/docker-java-transport/pom.xml index 6a9e95270..8be456dd1 100644 --- a/docker-java-transport/pom.xml +++ b/docker-java-transport/pom.xml @@ -37,7 +37,7 @@ net.java.dev.jna jna - 5.18.0 + 5.18.1 provided From cbf88f5a6d3407159c69fd0ffc715a6ff4d11ef8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:06:35 -0600 Subject: [PATCH 120/137] Bump com.fasterxml.jackson.core:jackson-databind from 2.19.2 to 2.20.1 (#2537) Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.19.2 to 2.20.1. - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.20.1 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-core/pom.xml | 2 +- docker-java/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-java-core/pom.xml b/docker-java-core/pom.xml index 90fa3a813..89c72c024 100644 --- a/docker-java-core/pom.xml +++ b/docker-java-core/pom.xml @@ -58,7 +58,7 @@ com.fasterxml.jackson.core jackson-databind - 2.19.2 + 2.20.1 diff --git a/docker-java/pom.xml b/docker-java/pom.xml index b6f5c8564..3cfd7f255 100644 --- a/docker-java/pom.xml +++ b/docker-java/pom.xml @@ -125,8 +125,8 @@ com.fasterxml.jackson.core jackson-databind - - 2.19.2 + + 2.20.1 test From d72d7418ecb1aea54fffb32924960822029910c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 11:25:27 -0600 Subject: [PATCH 121/137] Bump commons-io:commons-io from 2.20.0 to 2.21.0 (#2539) Bumps [commons-io:commons-io](https://github.com/apache/commons-io) from 2.20.0 to 2.21.0. - [Changelog](https://github.com/apache/commons-io/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-io/compare/rel/commons-io-2.20.0...rel/commons-io-2.21.0) --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-version: 2.21.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c7c05864c..72add3980 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 2.47 4.5.12 1.28.0 - 2.20.0 + 2.21.0 3.19.0 1.7.30 From 7ca5a47190dc4c9c9499a88a79369e436784ad94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 11:25:49 -0600 Subject: [PATCH 122/137] Bump org.testcontainers:testcontainers from 1.21.3 to 2.0.1 (#2530) Bumps [org.testcontainers:testcontainers](https://github.com/testcontainers/testcontainers-java) from 1.21.3 to 2.0.1. - [Release notes](https://github.com/testcontainers/testcontainers-java/releases) - [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.21.3...2.0.1) --- updated-dependencies: - dependency-name: org.testcontainers:testcontainers dependency-version: 2.0.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index a7a74101b..3d38f9dfc 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -46,7 +46,7 @@ org.testcontainers testcontainers - 1.21.3 + 2.0.1 From c6f0c7202e3e50d9b5e234bd7cb5643551dd5ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 12 Nov 2025 18:33:11 -0600 Subject: [PATCH 123/137] Set default docker API version to 1.44 (#2540) --- .../src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java | 3 --- .../java/com/github/dockerjava/cmd/CreateContainerCmdIT.java | 4 ++-- .../java/com/github/dockerjava/cmd/InspectContainerCmdIT.java | 4 +++- .../test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java | 4 ++-- .../test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java | 2 +- .../com/github/dockerjava/cmd/RestartContainerCmdImplIT.java | 2 +- .../src/test/java/com/github/dockerjava/core/DockerRule.java | 2 +- .../dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java | 4 ++-- 8 files changed, 12 insertions(+), 13 deletions(-) diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java index 39f51adc7..bd87d4aab 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CommitCmdIT.java @@ -46,9 +46,6 @@ public void commit() throws DockerException, InterruptedException { InspectImageResponse inspectImageResponse = dockerRule.getClient().inspectImageCmd(imageId).exec(); LOG.info("Image Inspect: {}", inspectImageResponse.toString()); - assertThat(inspectImageResponse, hasField("container", startsWith(container.getId()))); - assertThat(inspectImageResponse.getContainerConfig().getImage(), equalTo(DEFAULT_IMAGE)); - InspectImageResponse busyboxImg = dockerRule.getClient().inspectImageCmd("busybox").exec(); assertThat(inspectImageResponse.getParent(), equalTo(busyboxImg.getId())); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java index d91791cbc..99d5dd997 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/CreateContainerCmdIT.java @@ -60,7 +60,7 @@ import static com.github.dockerjava.api.model.HostConfig.newHostConfig; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_23; import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_24; -import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_43; +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_44; import static com.github.dockerjava.junit.DockerMatchers.isGreaterOrEqual; import static com.github.dockerjava.junit.DockerMatchers.mountedVolumes; import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE; @@ -1148,7 +1148,7 @@ public void shouldHandleANetworkAliasWithoutACustomNetworkGracefully() { @Test public void createContainerWithAnnotations() throws DockerException { DefaultDockerClientConfig forcedConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withApiVersion(VERSION_1_43) + .withApiVersion(VERSION_1_44) .withRegistryUrl("https://index.docker.io/v1/") .build(); diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java index cc1468f7f..e47a911d7 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/InspectContainerCmdIT.java @@ -6,6 +6,7 @@ import com.github.dockerjava.api.exception.DockerException; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.api.model.Container; +import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -102,7 +103,7 @@ public void inspectContainerWithSize() throws DockerException { assertNotNull(containerInfo.getSizeRootFs()); assertTrue(containerInfo.getSizeRootFs() > 0L); assertNotNull(containerInfo.getSizeRw()); - assertEquals(0L, containerInfo.getSizeRw().longValue()); + assertEquals(4096, containerInfo.getSizeRw().longValue()); } } @@ -127,6 +128,7 @@ public void inspectContainerRestartCount() throws DockerException { } @Test + @Ignore public void inspectContainerNetworkSettings() throws DockerException { CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox") diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java index 38b756dab..67ba85672 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ListImagesCmdIT.java @@ -40,9 +40,9 @@ public void listImages() throws DockerException { Image img = images.get(0); assertThat(img.getCreated(), is(greaterThan(0L))); - assertThat(img.getVirtualSize(), is(greaterThan(0L))); + assertThat(img.getSize(), is(greaterThan(0L))); assertThat(img.getId(), not(is(emptyString()))); - assertThat(img.getRepoTags(), not(emptyArray())); + assertThat(img.getRepoTags(), emptyArray()); } @Test diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java index 5b87f17a6..36a8d51fc 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/LoadImageCmdIT.java @@ -25,7 +25,7 @@ public class LoadImageCmdIT extends CmdIT { @Before public void beforeMethod() { - expectedImageId = "sha256:56031f66eb0cef2e2e5cb2d1dabafaa0ebcd0a18a507d313b5bdb8c0472c5eba"; + expectedImageId = "sha256:28a8ed28c8b7bd9d7fc00f22ac7df6d385436b93e88ac978943f3dba06d836b4"; if (findImageWithId(expectedImageId, dockerRule.getClient().listImagesCmd().exec()) != null) { dockerRule.getClient().removeImageCmd(expectedImageId).exec(); } diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java index bdf309dc2..592c9c650 100644 --- a/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/RestartContainerCmdImplIT.java @@ -55,7 +55,7 @@ public void restartContainerWithSignal() throws Exception { assumeThat("API version should be >= 1.42", dockerRule, isGreaterOrEqual(RemoteApiVersion.VERSION_1_42)); DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withApiVersion(RemoteApiVersion.VERSION_1_42) + .withApiVersion(RemoteApiVersion.VERSION_1_44) .withRegistryUrl("https://index.docker.io/v1/") .build(); try (DockerClient dockerClient = createDockerClient(dockerClientConfig)) { diff --git a/docker-java/src/test/java/com/github/dockerjava/core/DockerRule.java b/docker-java/src/test/java/com/github/dockerjava/core/DockerRule.java index 3fc5c40d7..af606a5b1 100644 --- a/docker-java/src/test/java/com/github/dockerjava/core/DockerRule.java +++ b/docker-java/src/test/java/com/github/dockerjava/core/DockerRule.java @@ -174,7 +174,7 @@ private static DefaultDockerClientConfig config() { public static DefaultDockerClientConfig config(String password) { DefaultDockerClientConfig.Builder builder = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withApiVersion(RemoteApiVersion.VERSION_1_30) + .withApiVersion(RemoteApiVersion.VERSION_1_44) .withRegistryUrl("https://index.docker.io/v1/"); if (password != null) { builder = builder.withRegistryPassword(password); diff --git a/docker-java/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java b/docker-java/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java index 5f7d200bf..03019f383 100644 --- a/docker-java/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java +++ b/docker-java/src/test/java/com/github/dockerjava/netty/NettyDockerCmdExecFactoryConfigTest.java @@ -43,7 +43,7 @@ public void testNettyDockerCmdExecFactoryConfigWithApiVersion() throws Exception Builder configBuilder = new DefaultDockerClientConfig.Builder() .withDockerTlsVerify(false) .withDockerHost("tcp://localhost:" + dockerPort) - .withApiVersion("1.23"); + .withApiVersion("1.44"); DockerClient client = DockerClientBuilder.getInstance(configBuilder) .withDockerCmdExecFactory(factory) @@ -57,7 +57,7 @@ public void testNettyDockerCmdExecFactoryConfigWithApiVersion() throws Exception List requests = server.getRequests(); assertEquals(1, requests.size()); - assertEquals("/v1.23/version", requests.get(0).uri()); + assertEquals("/v1.44/version", requests.get(0).uri()); } finally { server.stop(); } From faa88e16460a8cb321c9695cdbc34cb7a662458e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 07:57:35 -0600 Subject: [PATCH 124/137] Bump org.testcontainers:testcontainers from 2.0.1 to 2.0.2 (#2546) Bumps [org.testcontainers:testcontainers](https://github.com/testcontainers/testcontainers-java) from 2.0.1 to 2.0.2. - [Release notes](https://github.com/testcontainers/testcontainers-java/releases) - [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-java/compare/2.0.1...2.0.2) --- updated-dependencies: - dependency-name: org.testcontainers:testcontainers dependency-version: 2.0.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 3d38f9dfc..d7253c786 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -46,7 +46,7 @@ org.testcontainers testcontainers - 2.0.1 + 2.0.2 From 37424b0039296979fcf272b08112e942d7f9d978 Mon Sep 17 00:00:00 2001 From: Matthias Wiedemann Date: Thu, 5 Mar 2026 22:40:31 +0100 Subject: [PATCH 125/137] Fix Docker image build (#2562) --- docker-java/src/test/resources/buildTests/ADD/url/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-java/src/test/resources/buildTests/ADD/url/Dockerfile b/docker-java/src/test/resources/buildTests/ADD/url/Dockerfile index 4fbfa3236..3036dbbe6 100644 --- a/docker-java/src/test/resources/buildTests/ADD/url/Dockerfile +++ b/docker-java/src/test/resources/buildTests/ADD/url/Dockerfile @@ -2,9 +2,9 @@ FROM busybox:latest # Copy testrun.sh files into the container -ADD http://www.example.com/index.html /tmp/some.html +ADD https://www.example.com/ /tmp/some.html ADD ./testrun.sh /tmp/ RUN mkdir -p /usr/local/bin RUN cp /tmp/testrun.sh /usr/local/bin/ && chmod +x /usr/local/bin/testrun.sh -CMD ["testrun.sh"] \ No newline at end of file +CMD ["testrun.sh"] From ea48fd6e742e35d5c4629df9a251a00026cc140d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 5 Mar 2026 16:12:39 -0600 Subject: [PATCH 126/137] Update maven version to 3.9.12 (#2591) --- .mvn/wrapper/MavenWrapperDownloader.java | 117 ------ .mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .mvn/wrapper/maven-wrapper.properties | 5 +- mvnw | 475 +++++++++++------------ mvnw.cmd | 321 +++++++-------- 5 files changed, 397 insertions(+), 521 deletions(-) delete mode 100644 .mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 .mvn/wrapper/maven-wrapper.jar diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index b901097f2..000000000 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 642d572ce..8dea6c227 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,3 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip diff --git a/mvnw b/mvnw index 41c0f0c23..bd8896bf2 100755 --- a/mvnw +++ b/mvnw @@ -19,292 +19,277 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir +# Apache Maven Wrapper startup batch script, version 3.3.4 # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac -fi +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 fi fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" +} - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" done + printf %x\\n $h +} - saveddir=`pwd` +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - M2_HOME=`dirname "$PRG"`/.. +die() { + printf %s\\n "$1" >&2 + exit 1 +} - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" fi -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" fi -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi +mkdir -p -- "${MAVEN_HOME%/*}" -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then + distributionSha256Result=true fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; fi -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi fi -########################################################################################## -# End of extension -########################################################################################## -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f fi -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 86115719e..92450f932 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,3 +1,4 @@ +<# : batch portion @REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @@ -18,165 +19,171 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir +@REM Apache Maven Wrapper startup batch script, version 3.3.4 @REM @REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output @REM ---------------------------------------------------------------------------- -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) ) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' + +$MAVEN_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" From c7f0c0b394ac314312d17e8158469bab23e49f4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 6 Mar 2026 16:00:26 -0600 Subject: [PATCH 127/137] Add support to get the history of an image (#2592) --- .../github/dockerjava/api/DockerClient.java | 3 + .../dockerjava/api/DockerClientDelegate.java | 6 ++ .../DelegatingDockerCmdExecFactory.java | 5 + .../api/command/DockerCmdExecFactory.java | 2 + .../api/command/ImageHistoryCmd.java | 31 ++++++ .../dockerjava/api/model/ImageHistory.java | 97 +++++++++++++++++++ .../core/AbstractDockerCmdExecFactory.java | 7 ++ .../dockerjava/core/DockerClientImpl.java | 7 ++ .../core/command/ImageHistoryCmdImpl.java | 42 ++++++++ .../core/exec/ImageHistoryCmdExec.java | 35 +++++++ .../api/model/ImageHistoryTest.java | 90 +++++++++++++++++ .../dockerjava/cmd/ImageHistoryCmdIT.java | 29 ++++++ .../samples/1.22/images/history/history.json | 32 ++++++ 13 files changed, 386 insertions(+) create mode 100644 docker-java-api/src/main/java/com/github/dockerjava/api/command/ImageHistoryCmd.java create mode 100644 docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageHistory.java create mode 100644 docker-java-core/src/main/java/com/github/dockerjava/core/command/ImageHistoryCmdImpl.java create mode 100644 docker-java-core/src/main/java/com/github/dockerjava/core/exec/ImageHistoryCmdExec.java create mode 100644 docker-java/src/test/java/com/github/dockerjava/api/model/ImageHistoryTest.java create mode 100644 docker-java/src/test/java/com/github/dockerjava/cmd/ImageHistoryCmdIT.java create mode 100644 docker-java/src/test/resources/samples/1.22/images/history/history.json diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java index e5f57e1bb..441decad3 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -26,6 +26,7 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.ImageHistoryCmd; import com.github.dockerjava.api.command.InspectNetworkCmd; import com.github.dockerjava.api.command.InspectServiceCmd; import com.github.dockerjava.api.command.InspectSwarmCmd; @@ -142,6 +143,8 @@ public interface DockerClient extends Closeable { InspectImageCmd inspectImageCmd(@Nonnull String imageId); + ImageHistoryCmd imageHistoryCmd(@Nonnull String imageId); + /** * @param name * The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null. diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java index 5de64641f..fe1f72670 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java @@ -26,6 +26,7 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.ImageHistoryCmd; import com.github.dockerjava.api.command.InspectNetworkCmd; import com.github.dockerjava.api.command.InspectServiceCmd; import com.github.dockerjava.api.command.InspectSwarmCmd; @@ -179,6 +180,11 @@ public InspectImageCmd inspectImageCmd(@Nonnull String imageId) { return getDockerClient().inspectImageCmd(imageId); } + @Override + public ImageHistoryCmd imageHistoryCmd(@Nonnull String imageId) { + return getDockerClient().imageHistoryCmd(imageId); + } + @Override public SaveImageCmd saveImageCmd(@Nonnull String name) { return getDockerClient().saveImageCmd(name); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java index 161ff2c29..8f102a10e 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java @@ -100,6 +100,11 @@ public InspectImageCmd.Exec createInspectImageCmdExec() { return getDockerCmdExecFactory().createInspectImageCmdExec(); } + @Override + public ImageHistoryCmd.Exec createImageHistoryCmdExec() { + return getDockerCmdExecFactory().createImageHistoryCmdExec(); + } + @Override public ListContainersCmd.Exec createListContainersCmdExec() { return getDockerCmdExecFactory().createListContainersCmdExec(); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index cedf6d40d..29c001737 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -37,6 +37,8 @@ public interface DockerCmdExecFactory extends Closeable { InspectImageCmd.Exec createInspectImageCmdExec(); + ImageHistoryCmd.Exec createImageHistoryCmdExec(); + ListContainersCmd.Exec createListContainersCmdExec(); CreateContainerCmd.Exec createCreateContainerCmdExec(); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ImageHistoryCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ImageHistoryCmd.java new file mode 100644 index 000000000..d93796ad2 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ImageHistoryCmd.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.api.command; + +import java.util.List; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.ImageHistory; + +/** + * Get the history of an image. + */ +public interface ImageHistoryCmd extends SyncDockerCmd> { + + @CheckForNull + String getImageId(); + + ImageHistoryCmd withImageId(@Nonnull String imageId); + + /** + * @throws NotFoundException + * No such image + */ + @Override + List exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec> { + } + +} diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageHistory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageHistory.java new file mode 100644 index 000000000..fb8f5d95c --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/ImageHistory.java @@ -0,0 +1,97 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.annotation.CheckForNull; +import java.io.Serializable; +import java.util.List; + +/** + * Represents an individual image layer information in response to the ImageHistory operation. + */ +@EqualsAndHashCode +@ToString +public class ImageHistory extends DockerObject implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("Id") + private String id; + + @JsonProperty("Created") + private Long created; + + @JsonProperty("CreatedBy") + private String createdBy; + + @JsonProperty("Tags") + private List tags; + + @JsonProperty("Size") + private Long size; + + @JsonProperty("Comment") + private String comment; + + @CheckForNull + public String getId() { + return id; + } + + public ImageHistory withId(String id) { + this.id = id; + return this; + } + + @CheckForNull + public Long getCreated() { + return created; + } + + public ImageHistory withCreated(Long created) { + this.created = created; + return this; + } + + @CheckForNull + public String getCreatedBy() { + return createdBy; + } + + public ImageHistory withCreatedBy(String createdBy) { + this.createdBy = createdBy; + return this; + } + + @CheckForNull + public List getTags() { + return tags; + } + + public ImageHistory withTags(List tags) { + this.tags = tags; + return this; + } + + @CheckForNull + public Long getSize() { + return size; + } + + public ImageHistory withSize(Long size) { + this.size = size; + return this; + } + + @CheckForNull + public String getComment() { + return comment; + } + + public ImageHistory withComment(String comment) { + this.comment = comment; + return this; + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java b/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java index e04ab8e3e..5b908dff4 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java @@ -29,6 +29,7 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.ImageHistoryCmd; import com.github.dockerjava.api.command.InspectNetworkCmd; import com.github.dockerjava.api.command.InspectServiceCmd; import com.github.dockerjava.api.command.InspectSwarmCmd; @@ -113,6 +114,7 @@ import com.github.dockerjava.core.exec.InspectContainerCmdExec; import com.github.dockerjava.core.exec.InspectExecCmdExec; import com.github.dockerjava.core.exec.InspectImageCmdExec; +import com.github.dockerjava.core.exec.ImageHistoryCmdExec; import com.github.dockerjava.core.exec.InspectNetworkCmdExec; import com.github.dockerjava.core.exec.InspectServiceCmdExec; import com.github.dockerjava.core.exec.InspectSwarmCmdExec; @@ -281,6 +283,11 @@ public InspectImageCmd.Exec createInspectImageCmdExec() { return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public ImageHistoryCmd.Exec createImageHistoryCmdExec() { + return new ImageHistoryCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public ListContainersCmd.Exec createListContainersCmdExec() { return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig()); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 55f530057..b17c1b481 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -28,6 +28,7 @@ import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectExecCmd; import com.github.dockerjava.api.command.InspectImageCmd; +import com.github.dockerjava.api.command.ImageHistoryCmd; import com.github.dockerjava.api.command.InspectNetworkCmd; import com.github.dockerjava.api.command.InspectServiceCmd; import com.github.dockerjava.api.command.InspectSwarmCmd; @@ -113,6 +114,7 @@ import com.github.dockerjava.core.command.InspectContainerCmdImpl; import com.github.dockerjava.core.command.InspectExecCmdImpl; import com.github.dockerjava.core.command.InspectImageCmdImpl; +import com.github.dockerjava.core.command.ImageHistoryCmdImpl; import com.github.dockerjava.core.command.InspectServiceCmdImpl; import com.github.dockerjava.core.command.InspectSwarmCmdImpl; import com.github.dockerjava.core.command.InspectVolumeCmdImpl; @@ -375,6 +377,11 @@ public InspectImageCmd inspectImageCmd(String imageId) { return new InspectImageCmdImpl(getDockerCmdExecFactory().createInspectImageCmdExec(), imageId); } + @Override + public ImageHistoryCmd imageHistoryCmd(String imageId) { + return new ImageHistoryCmdImpl(getDockerCmdExecFactory().createImageHistoryCmdExec(), imageId); + } + /** * * CONTAINER API * */ diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ImageHistoryCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ImageHistoryCmdImpl.java new file mode 100644 index 000000000..fafbd8da1 --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ImageHistoryCmdImpl.java @@ -0,0 +1,42 @@ +package com.github.dockerjava.core.command; + +import java.util.List; +import java.util.Objects; + +import com.github.dockerjava.api.command.ImageHistoryCmd; +import com.github.dockerjava.api.exception.NotFoundException; +import com.github.dockerjava.api.model.ImageHistory; + +/** + * Get the history of an image. + */ +public class ImageHistoryCmdImpl extends AbstrDockerCmd> implements + ImageHistoryCmd { + + private String imageId; + + public ImageHistoryCmdImpl(ImageHistoryCmd.Exec exec, String imageId) { + super(exec); + withImageId(imageId); + } + + @Override + public String getImageId() { + return imageId; + } + + @Override + public ImageHistoryCmd withImageId(String imageId) { + this.imageId = Objects.requireNonNull(imageId, "imageId was not specified"); + return this; + } + + /** + * @throws NotFoundException + * No such image + */ + @Override + public List exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ImageHistoryCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ImageHistoryCmdExec.java new file mode 100644 index 000000000..8ba2a066d --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ImageHistoryCmdExec.java @@ -0,0 +1,35 @@ +package com.github.dockerjava.core.exec; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.api.command.ImageHistoryCmd; +import com.github.dockerjava.api.model.ImageHistory; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.MediaType; +import com.github.dockerjava.core.WebTarget; + +public class ImageHistoryCmdExec extends AbstrSyncDockerCmdExec> implements + ImageHistoryCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ImageHistoryCmdExec.class); + + public ImageHistoryCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected List execute(ImageHistoryCmd command) { + WebTarget webResource = getBaseResource().path("/images/{id}/history").resolveTemplate("id", + command.getImageId()); + + LOGGER.trace("GET: {}", webResource); + + return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference>() { + }); + } + +} diff --git a/docker-java/src/test/java/com/github/dockerjava/api/model/ImageHistoryTest.java b/docker-java/src/test/java/com/github/dockerjava/api/model/ImageHistoryTest.java new file mode 100644 index 000000000..8f18facf0 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/api/model/ImageHistoryTest.java @@ -0,0 +1,90 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.github.dockerjava.test.serdes.JSONSamples; +import com.github.dockerjava.test.serdes.JSONTestHelper; +import org.junit.Test; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static com.github.dockerjava.core.RemoteApiVersion.VERSION_1_22; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +public class ImageHistoryTest { + + @Test + public void serderJson() throws IOException { + final List history = JSONTestHelper.getMapper().readValue( + JSONSamples.getSampleContent(VERSION_1_22, "images/history/history.json"), + new TypeReference>() { + } + ); + + assertThat(history, notNullValue()); + assertThat(history, hasSize(3)); + + final ImageHistory first = history.get(0); + assertThat(first.getId(), is("3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710")); + assertThat(first.getCreated(), is(1398108230L)); + assertThat(first.getCreatedBy(), is("/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /")); + assertThat(first.getTags(), hasSize(2)); + assertThat(first.getTags(), contains("ubuntu:lucid", "ubuntu:10.04")); + assertThat(first.getSize(), is(182964289L)); + assertThat(first.getComment(), is("")); + + final ImageHistory second = history.get(1); + assertThat(second.getId(), is("6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8")); + assertThat(second.getCreated(), is(1398108222L)); + assertThat(second.getTags(), empty()); + assertThat(second.getSize(), is(0L)); + + final ImageHistory third = history.get(2); + assertThat(third.getId(), is("511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158")); + assertThat(third.getCreated(), is(1371157430L)); + assertThat(third.getCreatedBy(), is("")); + assertThat(third.getTags(), contains("scratch12:latest", "scratch:latest")); + assertThat(third.getSize(), is(0L)); + assertThat(third.getComment(), is("Imported from -")); + + // Test round-trip serialization + final String serialized = JSONTestHelper.getMapper().writeValueAsString(history); + final List deserialized = JSONTestHelper.getMapper().readValue( + serialized, + new TypeReference>() { + } + ); + assertThat(deserialized, hasSize(3)); + assertThat(deserialized.get(0).getId(), is(first.getId())); + assertThat(deserialized.get(0).getCreated(), is(first.getCreated())); + assertThat(deserialized.get(0).getCreatedBy(), is(first.getCreatedBy())); + assertThat(deserialized.get(0).getTags(), is(first.getTags())); + assertThat(deserialized.get(0).getSize(), is(first.getSize())); + assertThat(deserialized.get(0).getComment(), is(first.getComment())); + } + + @Test + public void builderPattern() { + final ImageHistory history = new ImageHistory() + .withId("abc123") + .withCreated(1234567890L) + .withCreatedBy("/bin/sh -c echo hello") + .withTags(Arrays.asList("myimage:latest")) + .withSize(1024L) + .withComment("test comment"); + + assertThat(history.getId(), is("abc123")); + assertThat(history.getCreated(), is(1234567890L)); + assertThat(history.getCreatedBy(), is("/bin/sh -c echo hello")); + assertThat(history.getTags(), contains("myimage:latest")); + assertThat(history.getSize(), is(1024L)); + assertThat(history.getComment(), is("test comment")); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ImageHistoryCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ImageHistoryCmdIT.java new file mode 100644 index 000000000..16ae7e6a2 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ImageHistoryCmdIT.java @@ -0,0 +1,29 @@ +package com.github.dockerjava.cmd; + +import com.github.dockerjava.api.model.ImageHistory; +import org.junit.Test; + +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.notNullValue; + +public class ImageHistoryCmdIT extends CmdIT { + + @Test + public void imageHistory() { + List history = dockerRule.getClient().imageHistoryCmd("busybox").exec(); + + assertThat(history, notNullValue()); + assertThat(history, hasSize(greaterThan(0))); + + ImageHistory entry = history.get(0); + assertThat(entry.getId(), notNullValue()); + assertThat(entry.getCreated(), notNullValue()); + assertThat(entry.getCreatedBy(), notNullValue()); + assertThat(entry.getSize(), notNullValue()); + assertThat(entry.getComment(), notNullValue()); + } +} diff --git a/docker-java/src/test/resources/samples/1.22/images/history/history.json b/docker-java/src/test/resources/samples/1.22/images/history/history.json new file mode 100644 index 000000000..a38da2d8f --- /dev/null +++ b/docker-java/src/test/resources/samples/1.22/images/history/history.json @@ -0,0 +1,32 @@ +[ + { + "Id": "3db9c44f45209632d6050b35958829c3a2aa256d81b9a7be45b362ff85c54710", + "Created": 1398108230, + "CreatedBy": "/bin/sh -c #(nop) ADD file:eb15dbd63394e063b805a3c32ca7bf0266ef64676d5a6fab4801f2e81e2a5148 in /", + "Tags": [ + "ubuntu:lucid", + "ubuntu:10.04" + ], + "Size": 182964289, + "Comment": "" + }, + { + "Id": "6cfa4d1f33fb861d4d114f43b25abd0ac737509268065cdfd69d544a59c85ab8", + "Created": 1398108222, + "CreatedBy": "/bin/sh -c #(nop) MAINTAINER Tianon Gravi - mkimage-debootstrap.sh -i iproute,iputils-ping,ubuntu-minimal -t lucid.tar.xz lucid http://archive.ubuntu.com/ubuntu/", + "Tags": [], + "Size": 0, + "Comment": "" + }, + { + "Id": "511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158", + "Created": 1371157430, + "CreatedBy": "", + "Tags": [ + "scratch12:latest", + "scratch:latest" + ], + "Size": 0, + "Comment": "Imported from -" + } +] From a3cb696a3f9d20a726a777cc3fa817820164e23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 18 Mar 2026 11:34:45 -0600 Subject: [PATCH 128/137] Add support to export container (#2594) Fixes #2319 --- .../github/dockerjava/api/DockerClient.java | 10 ++++ .../dockerjava/api/DockerClientDelegate.java | 6 +++ .../DelegatingDockerCmdExecFactory.java | 5 ++ .../api/command/DockerCmdExecFactory.java | 2 + .../api/command/ExportContainerCmd.java | 31 +++++++++++ .../core/AbstractDockerCmdExecFactory.java | 7 +++ .../dockerjava/core/DockerClientImpl.java | 7 +++ .../core/command/ExportContainerCmdImpl.java | 41 +++++++++++++++ .../core/exec/ExportContainerCmdExec.java | 31 +++++++++++ .../dockerjava/cmd/ExportContainerCmdIT.java | 52 +++++++++++++++++++ 10 files changed, 192 insertions(+) create mode 100644 docker-java-api/src/main/java/com/github/dockerjava/api/command/ExportContainerCmd.java create mode 100644 docker-java-core/src/main/java/com/github/dockerjava/core/command/ExportContainerCmdImpl.java create mode 100644 docker-java-core/src/main/java/com/github/dockerjava/core/exec/ExportContainerCmdExec.java create mode 100644 docker-java/src/test/java/com/github/dockerjava/cmd/ExportContainerCmdIT.java diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java index 441decad3..bf6acdee0 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -6,6 +6,7 @@ import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.ExportContainerCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; @@ -233,6 +234,15 @@ public interface DockerClient extends Closeable { ContainerDiffCmd containerDiffCmd(@Nonnull String containerId); + /** + * Export the contents of a container's filesystem as a tar archive. + * + * @param containerId + * id of the container + * @return created command + */ + ExportContainerCmd exportContainerCmd(@Nonnull String containerId); + StopContainerCmd stopContainerCmd(@Nonnull String containerId); KillContainerCmd killContainerCmd(@Nonnull String containerId); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java index fe1f72670..da600bd4d 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java @@ -6,6 +6,7 @@ import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.ExportContainerCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; @@ -276,6 +277,11 @@ public ContainerDiffCmd containerDiffCmd(@Nonnull String containerId) { return getDockerClient().containerDiffCmd(containerId); } + @Override + public ExportContainerCmd exportContainerCmd(@Nonnull String containerId) { + return getDockerClient().exportContainerCmd(containerId); + } + @Override public StopContainerCmd stopContainerCmd(@Nonnull String containerId) { return getDockerClient().stopContainerCmd(containerId); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java index 8f102a10e..d7cdd97a9 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java @@ -180,6 +180,11 @@ public ContainerDiffCmd.Exec createContainerDiffCmdExec() { return getDockerCmdExecFactory().createContainerDiffCmdExec(); } + @Override + public ExportContainerCmd.Exec createExportContainerCmdExec() { + return getDockerCmdExecFactory().createExportContainerCmdExec(); + } + @Override public KillContainerCmd.Exec createKillContainerCmdExec() { return getDockerCmdExecFactory().createKillContainerCmdExec(); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 29c001737..bdf39269d 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -73,6 +73,8 @@ public interface DockerCmdExecFactory extends Closeable { ContainerDiffCmd.Exec createContainerDiffCmdExec(); + ExportContainerCmd.Exec createExportContainerCmdExec(); + KillContainerCmd.Exec createKillContainerCmdExec(); UpdateContainerCmd.Exec createUpdateContainerCmdExec(); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExportContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExportContainerCmd.java new file mode 100644 index 000000000..bef73d261 --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ExportContainerCmd.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.api.command; + +import java.io.InputStream; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Export the contents of a container as a tar archive. + */ +public interface ExportContainerCmd extends SyncDockerCmd { + + @CheckForNull + String getContainerId(); + + ExportContainerCmd withContainerId(@Nonnull String containerId); + + /** + * Its the responsibility of the caller to consume and/or close the {@link InputStream} to prevent connection leaks. + * + * @throws NotFoundException + * No such container + */ + @Override + InputStream exec() throws NotFoundException; + + interface Exec extends DockerCmdSyncExec { + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java b/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java index 5b908dff4..9e1d71020 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java @@ -8,6 +8,7 @@ import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.ExportContainerCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; @@ -89,6 +90,7 @@ import com.github.dockerjava.core.exec.CommitCmdExec; import com.github.dockerjava.core.exec.ConnectToNetworkCmdExec; import com.github.dockerjava.core.exec.ContainerDiffCmdExec; +import com.github.dockerjava.core.exec.ExportContainerCmdExec; import com.github.dockerjava.core.exec.CopyArchiveFromContainerCmdExec; import com.github.dockerjava.core.exec.CopyArchiveToContainerCmdExec; import com.github.dockerjava.core.exec.CopyFileFromContainerCmdExec; @@ -368,6 +370,11 @@ public ContainerDiffCmd.Exec createContainerDiffCmdExec() { return new ContainerDiffCmdExec(getBaseResource(), getDockerClientConfig()); } + @Override + public ExportContainerCmd.Exec createExportContainerCmdExec() { + return new ExportContainerCmdExec(getBaseResource(), getDockerClientConfig()); + } + @Override public KillContainerCmd.Exec createKillContainerCmdExec() { return new KillContainerCmdExec(getBaseResource(), getDockerClientConfig()); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index b17c1b481..a1ddc2897 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -7,6 +7,7 @@ import com.github.dockerjava.api.command.CommitCmd; import com.github.dockerjava.api.command.ConnectToNetworkCmd; import com.github.dockerjava.api.command.ContainerDiffCmd; +import com.github.dockerjava.api.command.ExportContainerCmd; import com.github.dockerjava.api.command.CopyArchiveFromContainerCmd; import com.github.dockerjava.api.command.CopyArchiveToContainerCmd; import com.github.dockerjava.api.command.CopyFileFromContainerCmd; @@ -93,6 +94,7 @@ import com.github.dockerjava.core.command.CommitCmdImpl; import com.github.dockerjava.core.command.ConnectToNetworkCmdImpl; import com.github.dockerjava.core.command.ContainerDiffCmdImpl; +import com.github.dockerjava.core.command.ExportContainerCmdImpl; import com.github.dockerjava.core.command.CopyArchiveFromContainerCmdImpl; import com.github.dockerjava.core.command.CopyArchiveToContainerCmdImpl; import com.github.dockerjava.core.command.CopyFileFromContainerCmdImpl; @@ -470,6 +472,11 @@ public ContainerDiffCmd containerDiffCmd(String containerId) { return new ContainerDiffCmdImpl(getDockerCmdExecFactory().createContainerDiffCmdExec(), containerId); } + @Override + public ExportContainerCmd exportContainerCmd(String containerId) { + return new ExportContainerCmdImpl(getDockerCmdExecFactory().createExportContainerCmdExec(), containerId); + } + @Override public StopContainerCmd stopContainerCmd(String containerId) { return new StopContainerCmdImpl(getDockerCmdExecFactory().createStopContainerCmdExec(), containerId); diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExportContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExportContainerCmdImpl.java new file mode 100644 index 000000000..92070a2e2 --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/ExportContainerCmdImpl.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.core.command; + +import java.io.InputStream; +import java.util.Objects; + +import com.github.dockerjava.api.command.ExportContainerCmd; +import com.github.dockerjava.api.exception.NotFoundException; + +/** + * Export the contents of a container as a tar archive. + */ +public class ExportContainerCmdImpl extends AbstrDockerCmd implements + ExportContainerCmd { + + private String containerId; + + public ExportContainerCmdImpl(ExportContainerCmd.Exec exec, String containerId) { + super(exec); + withContainerId(containerId); + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override + public ExportContainerCmdImpl withContainerId(String containerId) { + this.containerId = Objects.requireNonNull(containerId, "containerId was not specified"); + return this; + } + + /** + * @throws NotFoundException + * No such container + */ + @Override + public InputStream exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ExportContainerCmdExec.java b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ExportContainerCmdExec.java new file mode 100644 index 000000000..9dab86f29 --- /dev/null +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/exec/ExportContainerCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.core.exec; + +import java.io.InputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.github.dockerjava.api.command.ExportContainerCmd; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.MediaType; +import com.github.dockerjava.core.WebTarget; + +public class ExportContainerCmdExec extends AbstrSyncDockerCmdExec + implements ExportContainerCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExportContainerCmdExec.class); + + public ExportContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { + super(baseResource, dockerClientConfig); + } + + @Override + protected InputStream execute(ExportContainerCmd command) { + WebTarget webResource = getBaseResource().path("/containers/{id}/export").resolveTemplate("id", + command.getContainerId()); + + LOGGER.trace("GET: {}", webResource); + + return webResource.request().accept(MediaType.APPLICATION_X_TAR).get(); + } +} diff --git a/docker-java/src/test/java/com/github/dockerjava/cmd/ExportContainerCmdIT.java b/docker-java/src/test/java/com/github/dockerjava/cmd/ExportContainerCmdIT.java new file mode 100644 index 000000000..8e4712d84 --- /dev/null +++ b/docker-java/src/test/java/com/github/dockerjava/cmd/ExportContainerCmdIT.java @@ -0,0 +1,52 @@ +package com.github.dockerjava.cmd; + +import com.github.dockerjava.api.command.CreateContainerResponse; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.InputStream; + +import static com.github.dockerjava.core.DockerRule.DEFAULT_IMAGE; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.emptyString; + +public class ExportContainerCmdIT extends CmdIT { + + private static final Logger LOG = LoggerFactory.getLogger(ExportContainerCmdIT.class); + + @Test + public void exportContainerHasCreatedFile() throws Exception { + CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE) + .withCmd("touch", "/myExportedFile") + .exec(); + + LOG.info("Created container: {}", container.toString()); + assertThat(container.getId(), not(is(emptyString()))); + + dockerRule.getClient().startContainerCmd(container.getId()).exec(); + + int exitCode = dockerRule.getClient().waitContainerCmd(container.getId()).start() + .awaitStatusCode(); + assertThat(exitCode, is(0)); + + try (InputStream response = dockerRule.getClient().exportContainerCmd(container.getId()).exec()) { + boolean foundFile = false; + try (TarArchiveInputStream tarStream = new TarArchiveInputStream(response)) { + TarArchiveEntry entry; + while ((entry = tarStream.getNextTarEntry()) != null) { + if (entry.getName().contains("myExportedFile")) { + foundFile = true; + break; + } + } + } + assertThat("Exported archive should contain the created file", foundFile, is(true)); + } + } + +} From 0ae6ea05a2813b2c61e78aa44a19f466db783f95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:06:39 -0600 Subject: [PATCH 129/137] Bump netty.version from 4.2.7.Final to 4.2.10.Final (#2585) Bumps `netty.version` from 4.2.7.Final to 4.2.10.Final. Updates `io.netty:netty-codec-http` from 4.2.7.Final to 4.2.10.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.7.Final...netty-4.2.10.Final) Updates `io.netty:netty-handler` from 4.2.7.Final to 4.2.10.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.7.Final...netty-4.2.10.Final) Updates `io.netty:netty-handler-proxy` from 4.2.7.Final to 4.2.10.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.7.Final...netty-4.2.10.Final) Updates `io.netty:netty-transport-native-epoll` from 4.2.7.Final to 4.2.10.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.7.Final...netty-4.2.10.Final) Updates `io.netty:netty-transport-native-kqueue` from 4.2.7.Final to 4.2.10.Final - [Commits](https://github.com/netty/netty/compare/netty-4.2.7.Final...netty-4.2.10.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-version: 4.2.10.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler dependency-version: 4.2.10.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler-proxy dependency-version: 4.2.10.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-epoll dependency-version: 4.2.10.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-kqueue dependency-version: 4.2.10.Final dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 72add3980..19347a9ac 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ 1.2.3 - 4.2.7.Final + 4.2.10.Final 2.2 1.8 2.3.3 From 6e1c22c7fb28f0cd03e1768f151179bf7ffa71f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:06:50 -0600 Subject: [PATCH 130/137] Bump org.assertj:assertj-core from 3.27.6 to 3.27.7 (#2580) Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.6 to 3.27.7. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.6...assertj-build-3.27.7) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index d7253c786..c7accb95f 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -34,7 +34,7 @@ org.assertj assertj-core - 3.27.6 + 3.27.7 From 5bb3971c9fafd0336fe32de0ebccdc15493e4757 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:07:00 -0600 Subject: [PATCH 131/137] Bump com.github.siom79.japicmp:japicmp-maven-plugin (#2576) Bumps [com.github.siom79.japicmp:japicmp-maven-plugin](https://github.com/siom79/japicmp) from 0.24.2 to 0.25.4. - [Release notes](https://github.com/siom79/japicmp/releases) - [Changelog](https://github.com/siom79/japicmp/blob/master/release.py) - [Commits](https://github.com/siom79/japicmp/compare/japicmp-base-0.24.2...japicmp-base-0.25.4) --- updated-dependencies: - dependency-name: com.github.siom79.japicmp:japicmp-maven-plugin dependency-version: 0.25.4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 19347a9ac..0189fadf0 100644 --- a/pom.xml +++ b/pom.xml @@ -242,7 +242,7 @@ com.github.siom79.japicmp japicmp-maven-plugin - 0.24.2 + 0.25.4 From f70fb4065003532e0f4190aca200e8e1de97f315 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:07:19 -0600 Subject: [PATCH 132/137] Bump org.sonatype.central:central-publishing-maven-plugin (#2573) Bumps [org.sonatype.central:central-publishing-maven-plugin](https://github.com/sonatype/central-publishing-maven-plugin) from 0.9.0 to 0.10.0. - [Commits](https://github.com/sonatype/central-publishing-maven-plugin/commits) --- updated-dependencies: - dependency-name: org.sonatype.central:central-publishing-maven-plugin dependency-version: 0.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0189fadf0..47a578c05 100644 --- a/pom.xml +++ b/pom.xml @@ -287,7 +287,7 @@ org.sonatype.central central-publishing-maven-plugin - 0.9.0 + 0.10.0 true central From 36e5c0f45b6f847c7a811d650656b853795aa76a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:07:33 -0600 Subject: [PATCH 133/137] Bump org.testcontainers:testcontainers from 2.0.2 to 2.0.3 (#2564) Bumps [org.testcontainers:testcontainers](https://github.com/testcontainers/testcontainers-java) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/testcontainers/testcontainers-java/releases) - [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-java/compare/2.0.2...2.0.3) --- updated-dependencies: - dependency-name: org.testcontainers:testcontainers dependency-version: 2.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index c7accb95f..8544e8f06 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -46,7 +46,7 @@ org.testcontainers testcontainers - 2.0.2 + 2.0.3 From 0dde6bc10b88b6d2edbc3dcc49917b8b5582d145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 18 Mar 2026 12:26:27 -0600 Subject: [PATCH 134/137] Deprecate ListImagesCmd#withImageNameFilter (#2595) Fixes #2557 --- .../com/github/dockerjava/api/command/ListImagesCmd.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java index cc60a5bcc..99a9fc200 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/ListImagesCmd.java @@ -26,6 +26,11 @@ public interface ListImagesCmd extends SyncDockerCmd> { */ ListImagesCmd withShowAll(Boolean showAll); + /** + * Filter images by name + * @deprecated use {@link #withFilter(String, Collection)} + */ + @Deprecated ListImagesCmd withImageNameFilter(String imageName); /** From 7b7fabd4567573e4957e549365dc0df8c2e54ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 18 Mar 2026 12:36:28 -0600 Subject: [PATCH 135/137] Update actions/checkout and actions/setup-java --- .github/workflows/ci.yml | 8 ++++---- .github/workflows/release.yml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d7b105d1d..5a87a3c3f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,9 +16,9 @@ jobs: - { name: "default", javaVersion: 17 } - { name: "default", javaVersion: 21 } steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up JDK - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: ${{matrix.javaVersion}} distribution: temurin @@ -36,9 +36,9 @@ jobs: tcp: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up JDK - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: 8 distribution: temurin diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 16777daa6..d3ddc4b2e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,9 +10,9 @@ jobs: build: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up JDK 8 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: 8 distribution: temurin From 1cf970e7a68638dda1a60a20d88eafd0b0292f7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 09:13:37 -0600 Subject: [PATCH 136/137] Bump netty.version from 4.2.10.Final to 4.2.12.Final (#2605) Bumps `netty.version` from 4.2.10.Final to 4.2.12.Final. Updates `io.netty:netty-codec-http` from 4.2.10.Final to 4.2.12.Final - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.2.10.Final...netty-4.2.12.Final) Updates `io.netty:netty-handler` from 4.2.10.Final to 4.2.12.Final - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.2.10.Final...netty-4.2.12.Final) Updates `io.netty:netty-handler-proxy` from 4.2.10.Final to 4.2.12.Final - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.2.10.Final...netty-4.2.12.Final) Updates `io.netty:netty-transport-native-epoll` from 4.2.10.Final to 4.2.12.Final - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.2.10.Final...netty-4.2.12.Final) Updates `io.netty:netty-transport-native-kqueue` from 4.2.10.Final to 4.2.12.Final - [Release notes](https://github.com/netty/netty/releases) - [Commits](https://github.com/netty/netty/compare/netty-4.2.10.Final...netty-4.2.12.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-version: 4.2.12.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler dependency-version: 4.2.12.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-handler-proxy dependency-version: 4.2.12.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-epoll dependency-version: 4.2.12.Final dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.netty:netty-transport-native-kqueue dependency-version: 4.2.12.Final dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 47a578c05..f5f16405c 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ 1.2.3 - 4.2.10.Final + 4.2.12.Final 2.2 1.8 2.3.3 From ceabb3b054e4861a14a30042e539d9c2034e6973 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 09:13:54 -0600 Subject: [PATCH 137/137] Bump org.testcontainers:testcontainers from 2.0.3 to 2.0.4 (#2600) Bumps [org.testcontainers:testcontainers](https://github.com/testcontainers/testcontainers-java) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/testcontainers/testcontainers-java/releases) - [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/testcontainers/testcontainers-java/compare/2.0.3...2.0.4) --- updated-dependencies: - dependency-name: org.testcontainers:testcontainers dependency-version: 2.0.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docker-java-transport-tck/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-java-transport-tck/pom.xml b/docker-java-transport-tck/pom.xml index 8544e8f06..76ffe1a6b 100644 --- a/docker-java-transport-tck/pom.xml +++ b/docker-java-transport-tck/pom.xml @@ -46,7 +46,7 @@ org.testcontainers testcontainers - 2.0.3 + 2.0.4