|
27 | 27 | import org.testcontainers.UnstableAPI; |
28 | 28 | import org.testcontainers.utility.TestcontainersConfiguration; |
29 | 29 |
|
| 30 | +import java.io.BufferedReader; |
30 | 31 | import java.io.File; |
| 32 | +import java.io.IOException; |
| 33 | +import java.io.InputStreamReader; |
31 | 34 | import java.net.InetSocketAddress; |
32 | 35 | import java.net.Socket; |
33 | 36 | import java.net.SocketAddress; |
@@ -403,9 +406,20 @@ public static DockerClient getClientForConfig(TransportConfig transportConfig) { |
403 | 406 |
|
404 | 407 | DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder(); |
405 | 408 |
|
406 | | - if (configBuilder.build().getApiVersion() == RemoteApiVersion.UNKNOWN_VERSION) { |
| 409 | + |
| 410 | + String dockerVersion = getDockerEngineVersionFromCli(); |
| 411 | + System.out.println("Detected Docker Engine Version: " + dockerVersion); |
| 412 | + |
| 413 | + if (isDockerVersionAtLeast(dockerVersion, 25)) { |
407 | 414 | configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_44); |
| 415 | + } else { |
| 416 | + configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_32); |
408 | 417 | } |
| 418 | + |
| 419 | + // if (configBuilder.build().getApiVersion() == RemoteApiVersion.UNKNOWN_VERSION) { |
| 420 | + // configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_44); |
| 421 | + // } |
| 422 | + |
409 | 423 | Map<String, String> headers = new HashMap<>(); |
410 | 424 | headers.put("x-tc-sid", DockerClientFactory.SESSION_ID); |
411 | 425 | headers.put("User-Agent", String.format("tc-java/%s", DockerClientFactory.TESTCONTAINERS_VERSION)); |
@@ -466,4 +480,38 @@ static String resolveDockerHostIpAddress(DockerClient client, URI dockerHost, bo |
466 | 480 | return null; |
467 | 481 | } |
468 | 482 | } |
| 483 | + |
| 484 | + |
| 485 | + private static String getDockerEngineVersionFromCli() { |
| 486 | + try { |
| 487 | + // dockerコマンドのパスが通っている前提 |
| 488 | + ProcessBuilder pb = new ProcessBuilder("docker", "version", "--format", "{{.Server.Version}}"); |
| 489 | + Process process = pb.start(); |
| 490 | + |
| 491 | + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { |
| 492 | + String version = reader.readLine(); |
| 493 | + if (version != null) { |
| 494 | + return version.trim(); |
| 495 | + } |
| 496 | + } |
| 497 | + } catch (IOException e) { |
| 498 | + log.warn("Failed to get docker version via CLI", e); |
| 499 | + } |
| 500 | + return "0.0.0"; |
| 501 | + } |
| 502 | + |
| 503 | + private static boolean isDockerVersionAtLeast(String versionString, int targetMajorVersion) { |
| 504 | + if (versionString == null || versionString.isEmpty()) return false; |
| 505 | + |
| 506 | + try { |
| 507 | + String majorPart = versionString.split("\\.")[0]; |
| 508 | + int majorVersion = Integer.parseInt(majorPart); |
| 509 | + |
| 510 | + return majorVersion >= targetMajorVersion; |
| 511 | + } catch (NumberFormatException e) { |
| 512 | + log.warn("Failed to parse docker version string: {}", versionString); |
| 513 | + return false; |
| 514 | + } |
| 515 | + } |
| 516 | + |
469 | 517 | } |
0 commit comments