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="iframe.php?url=https%3A%2F%2Fget.docker.com%2F"
-apt_url="iframe.php?url=https%3A%2F%2Fapt.dockerproject.org"
-yum_url="iframe.php?url=https%3A%2F%2Fyum.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="iframe.php?url=https%3A%2F%2Fgithub.com%2Fcurl+-sSL"
- elif command_exists wget; then
- curl="iframe.php?url=https%3A%2F%2Fgithub.com%2Fwget+-qO-"
- elif command_exists busybox && busybox --list-modules | grep -q wget; then
- curl="iframe.php?url=https%3A%2F%2Fgithub.com%2Fbusybox+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="iframe.php?url=https%3A%2F%2Fgithub.com%2Fcurl+-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/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 000000000..e5a6b0376
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+* @docker-java/team
+
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 7dec19aef..9bcef2d88 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -4,5 +4,13 @@ updates:
directory: "/"
schedule:
interval: weekly
+ day: monday
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" ]
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 255ad5a43..5a87a3c3f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,34 +2,54 @@ name: CI
on:
pull_request: {}
- push: { branches: [ master ] }
+ push: { branches: [ main ] }
+ workflow_dispatch:
jobs:
build:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- { name: "default", javaVersion: 8 }
- { name: "default", javaVersion: 17 }
- - { name: "over TCP", dockerHost: "tcp://127.0.0.1:2375", javaVersion: 8 }
- - { name: "Docker 18.06.3", dockerVersion: "18.06.3~ce~3-0~ubuntu", javaVersion: 8 }
-
+ - { name: "default", javaVersion: 21 }
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v6
- name: Set up JDK
- uses: actions/setup-java@v1
+ uses: actions/setup-java@v5
with:
java-version: ${{matrix.javaVersion}}
+ distribution: temurin
+ cache: maven
- name: Configure Docker
+ id: setup_docker
+ uses: docker/setup-docker-action@v4
+ with:
+ 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-24.04
+ steps:
+ - uses: actions/checkout@v6
+ - name: Set up JDK
+ uses: actions/setup-java@v5
+ with:
+ java-version: 8
+ distribution: temurin
+ cache: maven
+ - 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
diff --git a/.github/workflows/main.yml b/.github/workflows/release-drafter.yml
similarity index 96%
rename from .github/workflows/main.yml
rename to .github/workflows/release-drafter.yml
index 2c30bcdb1..99cd01cfc 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/release-drafter.yml
@@ -4,7 +4,7 @@ on:
push:
# branches to consider in the event; optional, defaults to all
branches:
- - master
+ - main
jobs:
update_release_draft:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 9f0acaa02..d3ddc4b2e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -8,17 +8,25 @@ on:
jobs:
build:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v6
- name: Set up JDK 8
- uses: actions/setup-java@v1
+ uses: actions/setup-java@v5
with:
java-version: 8
+ distribution: temurin
+ 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 master's CI status
+ # TODO check main's CI status
- name: Deploy with Maven
env:
- MAVEN_DEPLOYMENT_REPOSITORY: ${{ secrets.MAVEN_DEPLOYMENT_REPOSITORY }}
- 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/.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/.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 2cc7d4a55..000000000
Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ
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/CHANGELOG.md b/CHANGELOG.md
index 0ca44ee2e..5d344d93b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -301,7 +301,7 @@ v2.0.0
Release notes
* Some commands APIs has been changed to be callback-driven now to simplify the processing of the result streams for the client application. This affects namely the events, stats, log, attach, build, push and pull commands. Look at the Wiki how to [process events](https://github.com/docker-java/docker-java/wiki#handle-events) or how to [build an image](https://github.com/docker-java/docker-java/wiki#build-image-from-dockerfile) from dockerfile for example.
-* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmatically](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/master/src/test/resources/logback.xml) configuration file in the classpath.
+* The `DockerClientConfig` API has changed to free it from implementation specific configuration options like `readTimeout`, `maxTotalConnections`, `maxPerRouteConnections` and `enableLoggingFilter`. Most options can be configured via `DockerCmdExecFactoryImpl` [programmatically](https://github.com/docker-java/docker-java/wiki#intialize-docker-client-advanced) now. Logging is configurable via [logback](https://github.com/docker-java/docker-java/blob/main/src/test/resources/logback.xml) configuration file in the classpath.
All changes
diff --git a/README.md b/README.md
index c60907548..b1fa9c89e 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
[](https://gitter.im/docker-java/docker-java?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](https://mvnrepository.com/artifact/com.github.docker-java/docker-java)
-[](http://codecov.io/github/docker-java/docker-java?branch=master)
-[](https://github.com/docker-java/docker-java/blob/master/LICENSE)
+[](http://codecov.io/github/docker-java/docker-java?branch=master)
+[](https://github.com/docker-java/docker-java/blob/main/LICENSE)
# docker-java
Java API client for [Docker](http://docs.docker.io/ "Docker")
-# [Read the documentation here](docs/README.md)
\ No newline at end of file
+# [Read the documentation here](docs/README.md)
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 dca404bc1..dda682ab1 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.20
@@ -42,7 +42,7 @@
org.projectlombok
lombok
- 1.18.22
+ 1.18.38
provided
@@ -50,14 +50,14 @@
org.junit.jupiter
junit-jupiter
- 5.7.2
+ 5.13.4
test
com.tngtech.archunit
archunit-junit5
- 0.18.0
+ 1.4.1
test
@@ -81,6 +81,22 @@
+
+ com.github.siom79.japicmp
+ japicmp-maven-plugin
+
+
+
+ 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/DockerClient.java b/docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java
index 9df5c5f11..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;
@@ -26,6 +27,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;
@@ -42,6 +44,7 @@
import com.github.dockerjava.api.command.ListSwarmNodesCmd;
import com.github.dockerjava.api.command.ListTasksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
@@ -131,6 +134,8 @@ public interface DockerClient extends Closeable {
*/
LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream);
+ LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream);
+
SearchImagesCmd searchImagesCmd(@Nonnull String term);
RemoveImageCmd removeImageCmd(@Nonnull String imageId);
@@ -139,6 +144,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.
@@ -227,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 15f96df45..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;
@@ -26,6 +27,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;
@@ -42,6 +44,7 @@
import com.github.dockerjava.api.command.ListSwarmNodesCmd;
import com.github.dockerjava.api.command.ListTasksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
@@ -153,6 +156,11 @@ public LoadImageCmd loadImageCmd(@Nonnull InputStream imageStream) {
return getDockerClient().loadImageCmd(imageStream);
}
+ @Override
+ public LoadImageAsyncCmd loadImageAsyncCmd(@Nonnull InputStream imageStream) {
+ return getDockerClient().loadImageAsyncCmd(imageStream);
+ }
+
@Override
public SearchImagesCmd searchImagesCmd(@Nonnull String term) {
return getDockerClient().searchImagesCmd(term);
@@ -173,6 +181,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);
@@ -264,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/BuildImageResultCallback.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/BuildImageResultCallback.java
index 0bb0f0884..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
@@ -31,7 +31,7 @@ public void onNext(BuildResponseItem item) {
} else if (item.isErrorIndicated()) {
this.error = item.getError();
}
- LOGGER.debug(item.toString());
+ LOGGER.debug("{}", item);
}
/**
@@ -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");
}
}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java
index a4dfb5c03..19b3c3843 100644
--- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CopyArchiveToContainerCmd.java
@@ -16,6 +16,7 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd {
boolean isDirChildrenOnly();
+ boolean isCopyUIDGID();
/**
* Set container's id
*
@@ -49,6 +50,14 @@ public interface CopyArchiveToContainerCmd extends SyncDockerCmd {
*/
CopyArchiveToContainerCmd withNoOverwriteDirNonDir(boolean noOverwriteDirNonDir);
+ /**
+ * If set to true then ownership is set to the user and primary group at the destination
+ *
+ * @param copyUIDGID
+ * flag to know if ownership should be set to the user and primary group at the destination
+ */
+ CopyArchiveToContainerCmd withCopyUIDGID(boolean copyUIDGID);
+
/**
* If this flag is set to true, all children of the local directory will be copied to the remote without the root directory. For ex: if
* I have root/titi and root/tata and the remote path is /var/data. dirChildrenOnly = true will create /var/data/titi and /var/data/tata
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 37639a072..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
@@ -75,6 +75,11 @@ public LoadImageCmd.Exec createLoadImageCmdExec() {
return getDockerCmdExecFactory().createLoadImageCmdExec();
}
+ @Override
+ public LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec() {
+ return getDockerCmdExecFactory().createLoadImageAsyncCmdExec();
+ }
+
@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return getDockerCmdExecFactory().createSearchImagesCmdExec();
@@ -95,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();
@@ -170,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 d49606680..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
@@ -27,6 +27,8 @@ public interface DockerCmdExecFactory extends Closeable {
LoadImageCmd.Exec createLoadImageCmdExec();
+ LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec();
+
SearchImagesCmd.Exec createSearchImagesCmdExec();
RemoveImageCmd.Exec createRemoveImageCmdExec();
@@ -35,6 +37,8 @@ public interface DockerCmdExecFactory extends Closeable {
InspectImageCmd.Exec createInspectImageCmdExec();
+ ImageHistoryCmd.Exec createImageHistoryCmdExec();
+
ListContainersCmd.Exec createListContainersCmdExec();
CreateContainerCmd.Exec createCreateContainerCmdExec();
@@ -69,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-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/command/InspectContainerResponse.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/InspectContainerResponse.java
index 05492c51f..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,7 +61,10 @@ public class InspectContainerResponse extends DockerObject {
private String id;
@JsonProperty("SizeRootFs")
- private Integer sizeRootFs;
+ private Long sizeRootFs;
+
+ @JsonProperty("SizeRw")
+ private Long sizeRw;
@JsonProperty("Image")
private String imageId;
@@ -121,10 +124,14 @@ public String getId() {
return id;
}
- public Integer getSizeRootFs() {
+ public Long getSizeRootFs() {
return sizeRootFs;
}
+ public Long getSizeRw() {
+ return sizeRw;
+ }
+
public String getCreated() {
return created;
}
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 7741df743..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
@@ -1,5 +1,6 @@
package com.github.dockerjava.api.command;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -25,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);
/**
@@ -44,6 +50,15 @@ public interface ListImagesCmd extends SyncDockerCmd> {
*/
ListImagesCmd withLabelFilter(Map labels);
+ /**
+ * Filter images by reference
+ *
+ * @param reference string in the form {@code [:]}
+ */
+ ListImagesCmd withReferenceFilter(String reference);
+
+ ListImagesCmd withFilter(String key, Collection values);
+
interface Exec extends DockerCmdSyncExec> {
}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java
new file mode 100644
index 000000000..4f054db22
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageAsyncCmd.java
@@ -0,0 +1,22 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.model.LoadResponseItem;
+
+import java.io.InputStream;
+
+public interface LoadImageAsyncCmd extends AsyncDockerCmd {
+ InputStream getImageStream();
+
+ /**
+ * @param imageStream the InputStream of the tar file
+ */
+ LoadImageAsyncCmd withImageStream(InputStream imageStream);
+
+ @Override
+ default LoadImageCallback start() {
+ return exec(new LoadImageCallback());
+ }
+
+ interface Exec extends DockerCmdAsyncExec {
+ }
+}
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
new file mode 100644
index 000000000..80cca18de
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/LoadImageCallback.java
@@ -0,0 +1,49 @@
+package com.github.dockerjava.api.command;
+
+import com.github.dockerjava.api.async.ResultCallbackTemplate;
+import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.api.model.LoadResponseItem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class LoadImageCallback extends ResultCallbackTemplate {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(LoadImageCallback.class);
+
+ private String message;
+
+ private String error;
+
+ @Override
+ public void onNext(LoadResponseItem item) {
+ if (item.isBuildSuccessIndicated()) {
+ this.message = item.getMessage();
+ } else if (item.isErrorIndicated()) {
+ this.error = item.getError();
+ }
+
+ LOGGER.debug("{}", item);
+ }
+
+ public String awaitMessage() {
+ try {
+ awaitCompletion();
+ } catch (InterruptedException e) {
+ throw new DockerClientException("", e);
+ }
+
+ return getMessage();
+ }
+
+ private String getMessage() {
+ if (this.message != null) {
+ return this.message;
+ }
+
+ if (this.error == null) {
+ throw new DockerClientException("Could not build image");
+ }
+
+ throw new DockerClientException("Could not build image: " + this.error);
+ }
+}
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/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-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-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/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 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-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-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/Info.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/Info.java
index 0752778e3..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
@@ -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}
*/
@@ -235,6 +241,9 @@ public class Info extends DockerObject implements Serializable {
@JsonProperty("SecurityOptions")
private List securityOptions;
+ @JsonProperty("Runtimes")
+ private Map runtimes;
+
/**
* @see #architecture
*/
@@ -483,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
*/
@@ -491,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
*/
@@ -1067,7 +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;
+ }
}
diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/LoadResponseItem.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/LoadResponseItem.java
new file mode 100644
index 000000000..bf90c69bf
--- /dev/null
+++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/LoadResponseItem.java
@@ -0,0 +1,33 @@
+package com.github.dockerjava.api.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+public class LoadResponseItem extends ResponseItem {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final String IMPORT_SUCCESS = "Loaded image:";
+
+ /**
+ * Returns whether the stream field indicates a successful build operation
+ */
+ @JsonIgnore
+ public boolean isBuildSuccessIndicated() {
+ if (isErrorIndicated() || getStream() == null) {
+ return false;
+ }
+
+ return getStream().contains(IMPORT_SUCCESS);
+ }
+
+ @JsonIgnore
+ public String getMessage() {
+ if (!isBuildSuccessIndicated()) {
+ return null;
+ } else if (getStream().contains(IMPORT_SUCCESS)) {
+ return getStream();
+ }
+
+ return null;
+ }
+}
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,
}
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 f6d989d3f..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;
}
@@ -97,6 +105,12 @@ public Map getLabels() {
public static class ContainerNetworkConfig extends DockerObject implements Serializable {
private static final long serialVersionUID = 1L;
+ /**
+ * @since {@link RemoteApiVersion#VERSION_1_22}
+ */
+ @JsonProperty("Name")
+ private String name;
+
@JsonProperty("EndpointID")
private String endpointId;
@@ -109,6 +123,10 @@ public static class ContainerNetworkConfig extends DockerObject implements Seria
@JsonProperty("IPv6Address")
private String ipv6Address;
+ public String getName() {
+ return name;
+ }
+
public String getEndpointId() {
return endpointId;
}
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-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-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
}
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/pom.xml b/docker-java-core/pom.xml
index cec97d25d..89c72c024 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.20.1
@@ -69,7 +69,7 @@
org.bouncycastle
- bcpkix-jdk15on
+ bcpkix-jdk18on
${bouncycastle.version}
@@ -99,6 +99,7 @@
8
8
+ true
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 3e329911f..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
@@ -1,11 +1,14 @@
package com.github.dockerjava.core;
+import java.util.Objects;
+
import com.github.dockerjava.api.command.AttachContainerCmd;
import com.github.dockerjava.api.command.AuthCmd;
import com.github.dockerjava.api.command.BuildImageCmd;
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;
@@ -27,6 +30,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;
@@ -44,6 +48,7 @@
import com.github.dockerjava.api.command.ListSwarmNodesCmd;
import com.github.dockerjava.api.command.ListTasksCmd;
import com.github.dockerjava.api.command.ListVolumesCmd;
+import com.github.dockerjava.api.command.LoadImageAsyncCmd;
import com.github.dockerjava.api.command.LoadImageCmd;
import com.github.dockerjava.api.command.LogContainerCmd;
import com.github.dockerjava.api.command.LogSwarmObjectCmd;
@@ -85,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;
@@ -101,6 +107,7 @@
import com.github.dockerjava.core.exec.ExecStartCmdExec;
import com.github.dockerjava.core.exec.InspectConfigCmdExec;
import com.github.dockerjava.core.exec.ListConfigsCmdExec;
+import com.github.dockerjava.core.exec.LoadImageAsyncCmdExec;
import com.github.dockerjava.core.exec.RemoveConfigCmdExec;
import com.github.dockerjava.core.exec.ResizeContainerCmdExec;
import com.github.dockerjava.core.exec.ResizeExecCmdExec;
@@ -109,6 +116,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;
@@ -158,8 +166,6 @@
import com.github.dockerjava.core.exec.VersionCmdExec;
import com.github.dockerjava.core.exec.WaitContainerCmdExec;
-import static com.google.common.base.Preconditions.checkNotNull;
-
public abstract class AbstractDockerCmdExecFactory implements DockerCmdExecFactory, DockerClientConfigAware {
private DockerClientConfig dockerClientConfig;
@@ -168,15 +174,14 @@ public abstract class AbstractDockerCmdExecFactory implements DockerCmdExecFacto
protected Integer readTimeout;
protected DockerClientConfig getDockerClientConfig() {
- checkNotNull(dockerClientConfig,
+ Objects.requireNonNull(dockerClientConfig,
"Factor not initialized, dockerClientConfig not set. You probably forgot to call init()!");
return dockerClientConfig;
}
@Override
public void init(DockerClientConfig dockerClientConfig) {
- checkNotNull(dockerClientConfig, "config was not specified");
- this.dockerClientConfig = dockerClientConfig;
+ this.dockerClientConfig = Objects.requireNonNull(dockerClientConfig, "config was not specified");
}
@Override
@@ -255,6 +260,11 @@ public LoadImageCmd.Exec createLoadImageCmdExec() {
return new LoadImageCmdExec(getBaseResource(), getDockerClientConfig());
}
+ @Override
+ public LoadImageAsyncCmd.Exec createLoadImageAsyncCmdExec() {
+ return new LoadImageAsyncCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
@Override
public SearchImagesCmd.Exec createSearchImagesCmdExec() {
return new SearchImagesCmdExec(getBaseResource(), getDockerClientConfig());
@@ -275,6 +285,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());
@@ -355,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/DefaultDockerClientConfig.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java
index 7f17295f3..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,9 @@
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;
import org.apache.commons.lang3.builder.EqualsBuilder;
@@ -22,10 +25,10 @@
import java.net.URI;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Properties;
import java.util.Set;
-import static com.google.common.base.Preconditions.checkNotNull;
import static org.apache.commons.lang3.BooleanUtils.isTrue;
/**
@@ -37,6 +40,8 @@ public class DefaultDockerClientConfig implements Serializable, DockerClientConf
public static final String DOCKER_HOST = "DOCKER_HOST";
+ public static final String DOCKER_CONTEXT = "DOCKER_CONTEXT";
+
public static final String DOCKER_TLS_VERIFY = "DOCKER_TLS_VERIFY";
public static final String DOCKER_CONFIG = "DOCKER_CONFIG";
@@ -87,11 +92,13 @@ public class DefaultDockerClientConfig implements Serializable, DockerClientConf
private final RemoteApiVersion apiVersion;
- private DockerConfigFile dockerConfig = null;
+ private final DockerConfigFile dockerConfig;
- DefaultDockerClientConfig(URI dockerHost, String dockerConfigPath, String apiVersion, String registryUrl,
- String registryUsername, String registryPassword, String registryEmail, SSLConfig sslConfig) {
+ DefaultDockerClientConfig(URI dockerHost, DockerConfigFile dockerConfigFile, String dockerConfigPath, String apiVersion,
+ String registryUrl, String registryUsername, String registryPassword, String registryEmail,
+ SSLConfig sslConfig) {
this.dockerHost = checkDockerHostScheme(dockerHost);
+ this.dockerConfig = dockerConfigFile;
this.dockerConfigPath = dockerConfigPath;
this.apiVersion = RemoteApiVersion.parseConfigWithDefault(apiVersion);
this.sslConfig = sslConfig;
@@ -123,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