diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index f0541701a..9bcef2d88 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -4,9 +4,13 @@ updates:
directory: "/"
schedule:
interval: weekly
- day: tuesday
+ day: monday
open-pull-requests-limit: 99
rebase-strategy: disabled
ignore:
- - dependency-name: "com.fasterxml.jackson.core:*"
- update-types: [ "version-update:semver-minor" ]
+ - 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" ]
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:
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
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"
diff --git a/docker-java-api/pom.xml b/docker-java-api/pom.xml
index 0c9cde9ba..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.2
+ 5.13.4
test
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-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
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/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());
+ }
}
diff --git a/pom.xml b/pom.xml
index 6cefe8d3b..58fa183e8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,12 +57,12 @@
1.8
1.8
- 2.30.1
- 2.18.4
+ 2.47
+ 2.19.2
4.5.12
- 1.27.1
- 2.19.0
- 3.17.0
+ 1.28.0
+ 2.20.0
+ 3.18.0
1.7.30
1.81
@@ -71,7 +71,7 @@
1.2.3
- 4.2.2.Final
+ 4.2.4.Final
2.2
1.8
2.3.3