2626 * @author Finn Birich
2727 */
2828public class LinuxDockerProvider implements DockerProvider {
29- private static final String DOCKER_URL = "https://download.docker.com/linux/static/stable/x86_64/docker-26.1.4.tgz" ;
3029 private static final String ROOTLESSKIT_VERSION = "v2.1.1" ;
31- private static final String ROOTLESSKIT_DOWNLOAD_URL = "https://github.com/rootless-containers/rootlesskit/releases/download/%s/rootlesskit-x86_64 .tar.gz" ;
30+ private static final String ROOTLESSKIT_DOWNLOAD_URL = "https://github.com/rootless-containers/rootlesskit/releases/download/%s/rootlesskit-%s .tar.gz" ;
3231 private static final String DOCKER_ROOTLESS_SCRIPT_URL = "https://raw.githubusercontent.com/moby/moby/master/contrib/dockerd-rootless.sh" ;
3332 private static final Path DOCKER_DIR = Path .of (System .getProperty ("user.home" ), ".docker-java" );
3433 private static final Path DOCKER_PATH = DOCKER_DIR .resolve ("docker/dockerd" );
3534 private static final Path ROOTLESSKIT_PATH = DOCKER_DIR .resolve ("rootlesskit" );
3635 private static final Path DOCKER_SOCKET_PATH = DOCKER_DIR .resolve ("run/docker.sock" );
36+ private static final Path DOCKER_VERSION_FILE = DOCKER_DIR .resolve (".docker-version" );
3737
3838 private static final String SLIRP4NETNS_VERSION = "v1.2.1" ;
39- private static final String SLIRP4NETNS_DOWNLOAD_URL = "https://github.com/rootless-containers/slirp4netns/releases/download/%s/slirp4netns-x86_64 " ;
39+ private static final String SLIRP4NETNS_DOWNLOAD_URL = "https://github.com/rootless-containers/slirp4netns/releases/download/%s/slirp4netns-%s " ;
4040 private static final Path SLIRP4NETNS_DIR = DOCKER_DIR .resolve ("slirp4netns" );
4141 private static final Path SLIRP4NETNS_PATH = SLIRP4NETNS_DIR .resolve ("slirp4netns" );
4242
@@ -52,7 +52,25 @@ public void ensureInstalled() throws IOException, InterruptedException {
5252 }
5353
5454 private void ensureDockerInstalled () throws IOException , InterruptedException {
55- if (!Files .exists (DOCKER_PATH )) {
55+ boolean autoUpdate = Boolean .parseBoolean (System .getProperty ("docker.auto.update" , "true" ));
56+ String latestVersion = DockerVersionFetcher .getLatestVersion ();
57+ boolean needsUpdate = true ;
58+
59+ if (Files .exists (DOCKER_PATH )) {
60+ if (autoUpdate && Files .exists (DOCKER_VERSION_FILE )) {
61+ String installedVersion = Files .readString (DOCKER_VERSION_FILE ).trim ();
62+ if (!installedVersion .equals (latestVersion )) {
63+ System .out .println ("Newer Docker version available. Updating from " + installedVersion + " to " + latestVersion );
64+ } else {
65+ System .out .println ("Docker is up to date. (" + latestVersion + ")" );
66+ needsUpdate = false ;
67+ }
68+ } else if (!autoUpdate ) {
69+ needsUpdate = false ;
70+ }
71+ }
72+
73+ if (needsUpdate ) {
5674 System .out .println ("Docker installation is incomplete or outdated. Re-installing..." );
5775
5876 Path dockerInstallDir = DOCKER_DIR .resolve ("docker" );
@@ -64,7 +82,22 @@ private void ensureDockerInstalled() throws IOException, InterruptedException {
6482 }
6583 }
6684
67- downloadAndExtract (DOCKER_URL , DOCKER_DIR );
85+ String arch = getArch ();
86+ String dockerUrl = String .format ("https://download.docker.com/linux/static/stable/%s/docker-%s.tgz" , arch , latestVersion );
87+ downloadAndExtract (dockerUrl , DOCKER_DIR );
88+ Files .writeString (DOCKER_VERSION_FILE , latestVersion );
89+ }
90+ }
91+
92+ private String getArch () {
93+ String osArch = System .getProperty ("os.arch" );
94+ switch (osArch ) {
95+ case "amd64" :
96+ return "x86_64" ;
97+ case "aarch64" :
98+ return "aarch64" ;
99+ default :
100+ throw new UnsupportedOperationException ("Unsupported architecture: " + osArch );
68101 }
69102 }
70103
@@ -82,7 +115,7 @@ private void ensureRootlessKitInstalled() throws IOException, InterruptedExcepti
82115 return ;
83116 }
84117 System .out .println ("RootlessKit not found. Downloading..." );
85- String url = String .format (ROOTLESSKIT_DOWNLOAD_URL , ROOTLESSKIT_VERSION );
118+ String url = String .format (ROOTLESSKIT_DOWNLOAD_URL , ROOTLESSKIT_VERSION , getArch () );
86119 downloadAndExtract (url , ROOTLESSKIT_PATH );
87120 System .out .println ("RootlessKit installed successfully." );
88121 }
@@ -93,8 +126,8 @@ private void ensureSlirp4netnsInstalled() throws IOException, InterruptedExcepti
93126 }
94127 System .out .println ("slirp4netns not found. Downloading..." );
95128 SLIRP4NETNS_DIR .toFile ().mkdirs ();
96- String url = String .format (SLIRP4NETNS_DOWNLOAD_URL , SLIRP4NETNS_VERSION );
97- Path downloadedFilePath = SLIRP4NETNS_DIR .resolve ("slirp4netns-x86_64" );
129+ String url = String .format (SLIRP4NETNS_DOWNLOAD_URL , SLIRP4NETNS_VERSION , getArch () );
130+ Path downloadedFilePath = SLIRP4NETNS_DIR .resolve ("slirp4netns-" + getArch () );
98131 downloadFile (url , downloadedFilePath );
99132 Files .move (downloadedFilePath , SLIRP4NETNS_PATH );
100133 SLIRP4NETNS_PATH .toFile ().setExecutable (true );
0 commit comments