diff --git a/src/docker-compose-environment/docker-compose-environment.ts b/src/docker-compose-environment/docker-compose-environment.ts index 0f178d63b..ae54580b4 100644 --- a/src/docker-compose-environment/docker-compose-environment.ts +++ b/src/docker-compose-environment/docker-compose-environment.ts @@ -9,7 +9,7 @@ import { RandomUuid, Uuid } from "../uuid"; import { Environment } from "../docker/types"; import { listContainers } from "../docker/functions/container/list-containers"; import { getContainerById } from "../docker/functions/container/get-container"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; import { inspectContainer } from "../docker/functions/container/inspect-container"; import { containerLogs } from "../docker/functions/container/container-logs"; import { StartedDockerComposeEnvironment } from "./started-docker-compose-environment"; diff --git a/src/docker-compose/default-docker-compose-options.ts b/src/docker-compose/default-docker-compose-options.ts index 13608fb33..b2ed96b86 100644 --- a/src/docker-compose/default-docker-compose-options.ts +++ b/src/docker-compose/default-docker-compose-options.ts @@ -1,6 +1,6 @@ import { IDockerComposeOptions } from "docker-compose"; import { DockerComposeOptions } from "./docker-compose-options"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; import { composeLog } from "../logger"; import { EOL } from "os"; import { isNotEmptyString } from "../type-guards"; diff --git a/src/docker/docker-client-config.test.ts b/src/docker/client/docker-client-config.test.ts similarity index 100% rename from src/docker/docker-client-config.test.ts rename to src/docker/client/docker-client-config.test.ts diff --git a/src/docker/docker-client-config.ts b/src/docker/client/docker-client-config.ts similarity index 98% rename from src/docker/docker-client-config.ts rename to src/docker/client/docker-client-config.ts index 324619c74..ca27588f9 100644 --- a/src/docker/docker-client-config.ts +++ b/src/docker/client/docker-client-config.ts @@ -1,5 +1,5 @@ import path from "path"; -import { log } from "../logger"; +import { log } from "../../logger"; import { homedir } from "os"; import { existsSync } from "fs"; import { readFile } from "fs/promises"; diff --git a/src/docker/client/docker-client.ts b/src/docker/client/docker-client.ts new file mode 100644 index 000000000..0b57b3bbf --- /dev/null +++ b/src/docker/client/docker-client.ts @@ -0,0 +1,87 @@ +import Dockerode from "dockerode"; +import { log } from "../../logger"; +import { HostIps, lookupHostIps } from "../lookup-host-ips"; +import { getSystemInfo } from "../../system-info"; +import { RootlessUnixSocketStrategy } from "./strategy/rootless-unix-socket-strategy"; +import { streamToString } from "../../stream-utils"; +import { Readable } from "stream"; +import { resolveHost } from "../resolve-host"; +import { DockerClientStrategy } from "./strategy/docker-client-strategy"; +import { ConfigurationStrategy } from "./strategy/configuration-strategy"; +import { UnixSocketStrategy } from "./strategy/unix-socket-strategy"; +import { NpipeSocketStrategy } from "./strategy/npipe-socket-strategy"; + +export type Provider = "docker" | "podman"; + +export type DockerClient = { + uri: string; + provider: Provider; + host: string; + hostIps: HostIps; + dockerode: Dockerode; + indexServerAddress: string; + composeEnvironment: NodeJS.ProcessEnv; +}; + +export type DockerClientInit = { + uri: string; + dockerode: Dockerode; + composeEnvironment: NodeJS.ProcessEnv; +}; + +const getDockerClient = async (): Promise => { + const strategies: DockerClientStrategy[] = [ + new ConfigurationStrategy(), + new UnixSocketStrategy(), + new RootlessUnixSocketStrategy(), + new NpipeSocketStrategy(), + ]; + + for (const strategy of strategies) { + if (strategy.init) { + await strategy.init(); + } + if (strategy.isApplicable()) { + log.debug(`Found Docker client strategy "${strategy.getName()}"`); + const { uri, dockerode, composeEnvironment } = await strategy.getDockerClient(); + + log.debug(`Testing Docker client strategy "${uri}"...`); + if (await isDockerDaemonReachable(dockerode)) { + const indexServerAddress = (await getSystemInfo(dockerode)).dockerInfo.indexServerAddress; + const provider: Provider = uri.includes("podman.sock") ? "podman" : "docker"; + const host = await resolveHost(dockerode, provider, indexServerAddress, uri); + const hostIps = await lookupHostIps(host); + logDockerClient(strategy.getName(), host, hostIps); + return { uri, provider, host, hostIps, dockerode, indexServerAddress, composeEnvironment }; + } else { + log.warn(`Docker client strategy ${strategy.getName()} is not reachable`); + } + } + } + + throw new Error("No Docker client strategy found"); +}; + +const isDockerDaemonReachable = async (dockerode: Dockerode): Promise => { + try { + const response = await dockerode.ping(); + return (await streamToString(Readable.from(response))) === "OK"; + } catch (err) { + log.warn(`Docker daemon is not reachable: ${err}`); + return false; + } +}; + +const logDockerClient = (strategyName: string, host: string, hostIps: HostIps) => { + const formattedHostIps = hostIps.map((hostIp) => hostIp.address).join(", "); + log.info(`Using Docker client strategy "${strategyName}", Docker host "${host}" (${formattedHostIps})`); +}; + +let _dockerClient: Promise; + +export const dockerClient: () => Promise = () => { + if (!_dockerClient) { + _dockerClient = getDockerClient(); + } + return _dockerClient; +}; diff --git a/src/docker/client/strategy/configuration-strategy.ts b/src/docker/client/strategy/configuration-strategy.ts new file mode 100644 index 000000000..c2e6da784 --- /dev/null +++ b/src/docker/client/strategy/configuration-strategy.ts @@ -0,0 +1,57 @@ +import { DockerClientConfig, getDockerClientConfig } from "../docker-client-config"; +import Dockerode, { DockerOptions } from "dockerode"; +import { sessionId } from "../../session-id"; +import { URL } from "url"; +import { promises as fs } from "fs"; +import path from "path"; +import { DockerClientInit } from "../docker-client"; +import { DockerClientStrategy } from "./docker-client-strategy"; + +export class ConfigurationStrategy implements DockerClientStrategy { + private dockerConfig!: DockerClientConfig; + + async init(): Promise { + this.dockerConfig = await getDockerClientConfig(); + } + + async getDockerClient(): Promise { + const { dockerHost, dockerTlsVerify, dockerCertPath } = this.dockerConfig; + + const dockerOptions: DockerOptions = { headers: { "x-tc-sid": sessionId } }; + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const { pathname, hostname, port } = new URL(dockerHost!); + if (hostname !== "") { + dockerOptions.host = hostname; + dockerOptions.port = port; + } else { + dockerOptions.socketPath = pathname; + } + + if (dockerTlsVerify === "1" && dockerCertPath !== undefined) { + dockerOptions.ca = await fs.readFile(path.resolve(dockerCertPath, "ca.pem")); + dockerOptions.cert = await fs.readFile(path.resolve(dockerCertPath, "cert.pem")); + dockerOptions.key = await fs.readFile(path.resolve(dockerCertPath, "key.pem")); + } + + return { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + uri: dockerHost!, + dockerode: new Dockerode(dockerOptions), + composeEnvironment: { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + DOCKER_HOST: dockerHost!, + DOCKER_TLS_VERIFY: dockerTlsVerify, + DOCKER_CERT_PATH: dockerCertPath, + }, + }; + } + + isApplicable(): boolean { + return this.dockerConfig.dockerHost !== undefined; + } + + getName(): string { + return "ConfigurationStrategy"; + } +} diff --git a/src/docker/client/strategy/docker-client-strategy.ts b/src/docker/client/strategy/docker-client-strategy.ts new file mode 100644 index 000000000..c8c82c253 --- /dev/null +++ b/src/docker/client/strategy/docker-client-strategy.ts @@ -0,0 +1,11 @@ +import { DockerClientInit } from "../docker-client"; + +export interface DockerClientStrategy { + init?(): Promise; + + isApplicable(): boolean; + + getDockerClient(): Promise; + + getName(): string; +} diff --git a/src/docker/client/strategy/npipe-socket-strategy.ts b/src/docker/client/strategy/npipe-socket-strategy.ts new file mode 100644 index 000000000..e9caa354a --- /dev/null +++ b/src/docker/client/strategy/npipe-socket-strategy.ts @@ -0,0 +1,21 @@ +import Dockerode from "dockerode"; +import { DockerClientInit } from "../docker-client"; +import { DockerClientStrategy } from "./docker-client-strategy"; + +export class NpipeSocketStrategy implements DockerClientStrategy { + async getDockerClient(): Promise { + return { + uri: "npipe:////./pipe/docker_engine", + dockerode: new Dockerode({ socketPath: "//./pipe/docker_engine" }), + composeEnvironment: {}, + }; + } + + isApplicable(): boolean { + return process.platform === "win32"; + } + + getName(): string { + return "NpipeSocketStrategy"; + } +} diff --git a/src/docker/rootless-unix-socket-strategy.test.ts b/src/docker/client/strategy/rootless-unix-socket-strategy.test.ts similarity index 100% rename from src/docker/rootless-unix-socket-strategy.test.ts rename to src/docker/client/strategy/rootless-unix-socket-strategy.test.ts diff --git a/src/docker/rootless-unix-socket-strategy.ts b/src/docker/client/strategy/rootless-unix-socket-strategy.ts similarity index 91% rename from src/docker/rootless-unix-socket-strategy.ts rename to src/docker/client/strategy/rootless-unix-socket-strategy.ts index 65b0fbae9..e6c80492a 100644 --- a/src/docker/rootless-unix-socket-strategy.ts +++ b/src/docker/client/strategy/rootless-unix-socket-strategy.ts @@ -1,9 +1,10 @@ -import { isDefined } from "../type-guards"; +import { isDefined } from "../../../type-guards"; import { existsSync } from "fs"; import path from "path"; import os from "os"; import Dockerode from "dockerode"; -import { DockerClientInit, DockerClientStrategy } from "./docker-client"; +import { DockerClientInit } from "../docker-client"; +import { DockerClientStrategy } from "./docker-client-strategy"; export class RootlessUnixSocketStrategy implements DockerClientStrategy { private applicable!: boolean; diff --git a/src/docker/client/strategy/unix-socket-strategy.ts b/src/docker/client/strategy/unix-socket-strategy.ts new file mode 100644 index 000000000..cccca864f --- /dev/null +++ b/src/docker/client/strategy/unix-socket-strategy.ts @@ -0,0 +1,22 @@ +import Dockerode from "dockerode"; +import { existsSync } from "fs"; +import { DockerClientInit } from "../docker-client"; +import { DockerClientStrategy } from "./docker-client-strategy"; + +export class UnixSocketStrategy implements DockerClientStrategy { + async getDockerClient(): Promise { + return { + uri: "unix:///var/run/docker.sock", + dockerode: new Dockerode({ socketPath: "/var/run/docker.sock" }), + composeEnvironment: {}, + }; + } + + isApplicable(): boolean { + return (process.platform === "linux" || process.platform === "darwin") && existsSync("/var/run/docker.sock"); + } + + getName(): string { + return "UnixSocketStrategy"; + } +} diff --git a/src/docker/docker-client.ts b/src/docker/docker-client.ts deleted file mode 100644 index 60230a334..000000000 --- a/src/docker/docker-client.ts +++ /dev/null @@ -1,181 +0,0 @@ -import Dockerode, { DockerOptions } from "dockerode"; -import path from "path"; -import { log } from "../logger"; -import { URL } from "url"; -import { existsSync, promises as fs } from "fs"; -import { sessionId } from "./session-id"; -import { HostIps, lookupHostIps } from "./lookup-host-ips"; -import { getSystemInfo } from "../system-info"; -import { RootlessUnixSocketStrategy } from "./rootless-unix-socket-strategy"; -import { streamToString } from "../stream-utils"; -import { Readable } from "stream"; -import { DockerClientConfig, getDockerClientConfig } from "./docker-client-config"; -import { resolveHost } from "./resolve-host"; - -export type Provider = "docker" | "podman"; - -type DockerClient = { - uri: string; - provider: Provider; - host: string; - hostIps: HostIps; - dockerode: Dockerode; - indexServerAddress: string; - composeEnvironment: NodeJS.ProcessEnv; -}; - -const getDockerClient = async (): Promise => { - const strategies: DockerClientStrategy[] = [ - new ConfigurationStrategy(), - new UnixSocketStrategy(), - new RootlessUnixSocketStrategy(), - new NpipeSocketStrategy(), - ]; - - for (const strategy of strategies) { - if (strategy.init) { - await strategy.init(); - } - if (strategy.isApplicable()) { - log.debug(`Found Docker client strategy "${strategy.getName()}"`); - const { uri, dockerode, composeEnvironment } = await strategy.getDockerClient(); - log.debug(`Testing Docker client strategy "${uri}"...`); - if (await isDockerDaemonReachable(dockerode)) { - const indexServerAddress = (await getSystemInfo(dockerode)).dockerInfo.indexServerAddress; - const provider: Provider = uri.includes("podman.sock") ? "podman" : "docker"; - const host = await resolveHost(dockerode, provider, indexServerAddress, uri); - const hostIps = await lookupHostIps(host); - log.info( - `Using Docker client strategy "${strategy.getName()}", Docker host "${host}" (${hostIps - .map((hostIp) => hostIp.address) - .join(", ")})` - ); - return { uri, provider, host, hostIps, dockerode, indexServerAddress, composeEnvironment }; - } else { - log.warn(`Docker client strategy ${strategy.getName()} is not reachable`); - } - } - } - - throw new Error("No Docker client strategy found"); -}; - -const isDockerDaemonReachable = async (dockerode: Dockerode): Promise => { - try { - const response = await dockerode.ping(); - return (await streamToString(Readable.from(response))) === "OK"; - } catch (err) { - log.warn(`Docker daemon is not reachable: ${err}`); - return false; - } -}; - -export type DockerClientInit = { - uri: string; - dockerode: Dockerode; - composeEnvironment: NodeJS.ProcessEnv; -}; - -export interface DockerClientStrategy { - init?(): Promise; - - isApplicable(): boolean; - - getDockerClient(): Promise; - - getName(): string; -} - -class ConfigurationStrategy implements DockerClientStrategy { - private dockerConfig!: DockerClientConfig; - - async init(): Promise { - this.dockerConfig = await getDockerClientConfig(); - } - - async getDockerClient(): Promise { - const { dockerHost, dockerTlsVerify, dockerCertPath } = this.dockerConfig; - - const dockerOptions: DockerOptions = { headers: { "x-tc-sid": sessionId } }; - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const { pathname, hostname, port } = new URL(dockerHost!); - if (hostname !== "") { - dockerOptions.host = hostname; - dockerOptions.port = port; - } else { - dockerOptions.socketPath = pathname; - } - - if (dockerTlsVerify === "1" && dockerCertPath !== undefined) { - dockerOptions.ca = await fs.readFile(path.resolve(dockerCertPath, "ca.pem")); - dockerOptions.cert = await fs.readFile(path.resolve(dockerCertPath, "cert.pem")); - dockerOptions.key = await fs.readFile(path.resolve(dockerCertPath, "key.pem")); - } - - return { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - uri: dockerHost!, - dockerode: new Dockerode(dockerOptions), - composeEnvironment: { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - DOCKER_HOST: dockerHost!, - DOCKER_TLS_VERIFY: dockerTlsVerify, - DOCKER_CERT_PATH: dockerCertPath, - }, - }; - } - - isApplicable(): boolean { - return this.dockerConfig.dockerHost !== undefined; - } - - getName(): string { - return "ConfigurationStrategy"; - } -} - -class UnixSocketStrategy implements DockerClientStrategy { - async getDockerClient(): Promise { - return { - uri: "unix:///var/run/docker.sock", - dockerode: new Dockerode({ socketPath: "/var/run/docker.sock" }), - composeEnvironment: {}, - }; - } - - isApplicable(): boolean { - return (process.platform === "linux" || process.platform === "darwin") && existsSync("/var/run/docker.sock"); - } - - getName(): string { - return "UnixSocketStrategy"; - } -} - -class NpipeSocketStrategy implements DockerClientStrategy { - async getDockerClient(): Promise { - return { - uri: "npipe:////./pipe/docker_engine", - dockerode: new Dockerode({ socketPath: "//./pipe/docker_engine" }), - composeEnvironment: {}, - }; - } - - isApplicable(): boolean { - return process.platform === "win32"; - } - - getName(): string { - return "NpipeSocketStrategy"; - } -} - -let _dockerClient: Promise; - -export const dockerClient: () => Promise = () => { - if (!_dockerClient) { - _dockerClient = getDockerClient(); - } - return _dockerClient; -}; diff --git a/src/docker/functions/container/container-logs.ts b/src/docker/functions/container/container-logs.ts index 8f51590fe..35bd1e6e0 100644 --- a/src/docker/functions/container/container-logs.ts +++ b/src/docker/functions/container/container-logs.ts @@ -3,7 +3,7 @@ import { log } from "../../../logger"; import Dockerode from "dockerode"; import { demuxStream } from "../demux-stream"; import { Readable } from "stream"; -import { dockerClient } from "../../docker-client"; +import { dockerClient } from "../../client/docker-client"; export type ContainerLogsOptions = { since?: Date; diff --git a/src/docker/functions/container/create-container.ts b/src/docker/functions/container/create-container.ts index 8447e07f1..be22cdd0e 100644 --- a/src/docker/functions/container/create-container.ts +++ b/src/docker/functions/container/create-container.ts @@ -1,6 +1,6 @@ import { log } from "../../../logger"; import { DockerImageName } from "../../../docker-image-name"; -import { dockerClient } from "../../docker-client"; +import { dockerClient } from "../../client/docker-client"; import Dockerode, { PortMap as DockerodePortBindings } from "dockerode"; import { getContainerPort, hasHostBinding, PortWithOptionalBinding } from "../../../port"; import { createLabels } from "../create-labels"; diff --git a/src/docker/functions/container/exec-container.ts b/src/docker/functions/container/exec-container.ts index 732b50f09..697330512 100644 --- a/src/docker/functions/container/exec-container.ts +++ b/src/docker/functions/container/exec-container.ts @@ -4,7 +4,7 @@ import Dockerode from "dockerode"; import { execLog, log } from "../../../logger"; import byline from "byline"; import { demuxStream } from "../demux-stream"; -import { Provider } from "../../docker-client"; +import { Provider } from "../../client/docker-client"; export const execContainer = async ( dockerode: Dockerode, diff --git a/src/docker/functions/container/get-container.ts b/src/docker/functions/container/get-container.ts index dddd4b73e..1ee8016bf 100644 --- a/src/docker/functions/container/get-container.ts +++ b/src/docker/functions/container/get-container.ts @@ -1,4 +1,4 @@ -import { dockerClient } from "../../docker-client"; +import { dockerClient } from "../../client/docker-client"; import Dockerode from "dockerode"; import { log } from "../../../logger"; import { LABEL_TESTCONTAINERS_CONTAINER_HASH } from "../../../labels"; diff --git a/src/docker/functions/container/list-containers.ts b/src/docker/functions/container/list-containers.ts index d5014a14d..d4c7b49a9 100644 --- a/src/docker/functions/container/list-containers.ts +++ b/src/docker/functions/container/list-containers.ts @@ -1,5 +1,5 @@ import Dockerode from "dockerode"; -import { dockerClient } from "../../docker-client"; +import { dockerClient } from "../../client/docker-client"; import { log } from "../../../logger"; export const listContainers = async (): Promise => { diff --git a/src/docker/functions/image/build-image.ts b/src/docker/functions/image/build-image.ts index 2b0767d8e..780c007f4 100644 --- a/src/docker/functions/image/build-image.ts +++ b/src/docker/functions/image/build-image.ts @@ -3,7 +3,7 @@ import { PullPolicy } from "../../../pull-policy"; import { buildLog, log } from "../../../logger"; import tar from "tar-fs"; import byline from "byline"; -import { dockerClient } from "../../docker-client"; +import { dockerClient } from "../../client/docker-client"; import { createLabels } from "../create-labels"; import { BuildArgs, RegistryConfig } from "../../types"; import path from "path"; diff --git a/src/docker/functions/image/pull-image.ts b/src/docker/functions/image/pull-image.ts index 73e9ac9a1..4d433be62 100644 --- a/src/docker/functions/image/pull-image.ts +++ b/src/docker/functions/image/pull-image.ts @@ -1,10 +1,10 @@ import { DockerImageName } from "../../../docker-image-name"; -import { pullLog, log } from "../../../logger"; -import { PullStreamParser } from "../../pull-stream-parser"; +import { log, pullLog } from "../../../logger"; import { imageExists } from "./image-exists"; import Dockerode from "dockerode"; import { getAuthConfig } from "../../../registry-auth-locator/get-auth-config"; import AsyncLock from "async-lock"; +import byline from "byline"; export type PullImageOptions = { imageName: DockerImageName; @@ -28,8 +28,14 @@ export const pullImage = async ( log.info(`Pulling image "${options.imageName}"...`); const authconfig = await getAuthConfig(options.imageName.registry ?? indexServerAddress); const stream = await dockerode.pull(options.imageName.toString(), { authconfig }); - - await new PullStreamParser(options.imageName, pullLog).consume(stream); + return new Promise((resolve) => { + byline(stream).on("data", (line) => { + if (pullLog.enabled()) { + pullLog.trace(line, { imageName: options.imageName.toString() }); + } + }); + stream.on("end", resolve); + }); }); } catch (err) { log.error(`Failed to pull image "${options.imageName}": ${err}`); diff --git a/src/docker/functions/network/connect-network.ts b/src/docker/functions/network/connect-network.ts index e9816c082..d30e6d13d 100644 --- a/src/docker/functions/network/connect-network.ts +++ b/src/docker/functions/network/connect-network.ts @@ -1,5 +1,5 @@ import { log } from "../../../logger"; -import { dockerClient } from "../../docker-client"; +import { dockerClient } from "../../client/docker-client"; export type ConnectNetworkOptions = { containerId: string; diff --git a/src/docker/functions/network/create-network.ts b/src/docker/functions/network/create-network.ts index fdca715fe..48817e771 100644 --- a/src/docker/functions/network/create-network.ts +++ b/src/docker/functions/network/create-network.ts @@ -1,6 +1,6 @@ import { log } from "../../../logger"; import { Network } from "dockerode"; -import { dockerClient } from "../../docker-client"; +import { dockerClient } from "../../client/docker-client"; import { createLabels } from "../create-labels"; export type CreateNetworkOptions = { diff --git a/src/docker/functions/network/remove-network.ts b/src/docker/functions/network/remove-network.ts index ea7519dcd..80582b700 100644 --- a/src/docker/functions/network/remove-network.ts +++ b/src/docker/functions/network/remove-network.ts @@ -1,5 +1,5 @@ import { log } from "../../../logger"; -import { dockerClient } from "../../docker-client"; +import { dockerClient } from "../../client/docker-client"; export const removeNetwork = async (id: string): Promise => { try { diff --git a/src/docker/functions/run-in-container.test.ts b/src/docker/functions/run-in-container.test.ts index 51d40eae6..b5bac85c4 100644 --- a/src/docker/functions/run-in-container.test.ts +++ b/src/docker/functions/run-in-container.test.ts @@ -1,5 +1,5 @@ import { runInContainer } from "./run-in-container"; -import { dockerClient } from "../docker-client"; +import { dockerClient } from "../client/docker-client"; import Dockerode from "dockerode"; describe("runInContainer", () => { diff --git a/src/docker/pull-stream-parser.ts b/src/docker/pull-stream-parser.ts deleted file mode 100644 index ad04e9f42..000000000 --- a/src/docker/pull-stream-parser.ts +++ /dev/null @@ -1,19 +0,0 @@ -import byline from "byline"; -import { Readable } from "stream"; -import { Logger } from "../logger"; -import { DockerImageName } from "../docker-image-name"; - -export class PullStreamParser { - constructor(private readonly dockerImageName: DockerImageName, private readonly logger: Logger) {} - - public consume(stream: Readable): Promise { - return new Promise((resolve) => { - byline(stream).on("data", (line) => { - if (this.logger.enabled()) { - this.logger.trace(line, { imageName: this.dockerImageName.toString() }); - } - }); - stream.on("end", resolve); - }); - } -} diff --git a/src/docker/get-remote-docker-unix-socket-path.test.ts b/src/docker/remote-docker-unix-socket-path.test.ts similarity index 93% rename from src/docker/get-remote-docker-unix-socket-path.test.ts rename to src/docker/remote-docker-unix-socket-path.test.ts index 11111f7ef..2333fea20 100644 --- a/src/docker/get-remote-docker-unix-socket-path.test.ts +++ b/src/docker/remote-docker-unix-socket-path.test.ts @@ -1,4 +1,4 @@ -import { getRemoteDockerUnixSocketPath } from "./get-remote-docker-unix-socket-path"; +import { getRemoteDockerUnixSocketPath } from "./remote-docker-unix-socket-path"; test("should return TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE when provided", () => { const actual = getRemoteDockerUnixSocketPath("unix:///var/run/docker.sock", "linux", { diff --git a/src/docker/get-remote-docker-unix-socket-path.ts b/src/docker/remote-docker-unix-socket-path.ts similarity index 100% rename from src/docker/get-remote-docker-unix-socket-path.ts rename to src/docker/remote-docker-unix-socket-path.ts diff --git a/src/docker/resolve-host.ts b/src/docker/resolve-host.ts index 78251df0c..03f4ca701 100644 --- a/src/docker/resolve-host.ts +++ b/src/docker/resolve-host.ts @@ -3,7 +3,7 @@ import { URL } from "url"; import { log } from "../logger"; import { runInContainer } from "./functions/run-in-container"; import { existsSync } from "fs"; -import { Provider } from "./docker-client"; +import { Provider } from "./client/docker-client"; export const resolveHost = async ( dockerode: Dockerode, diff --git a/src/generic-container/generic-container-builder.ts b/src/generic-container/generic-container-builder.ts index 00e0e544d..7f67fb835 100644 --- a/src/generic-container/generic-container-builder.ts +++ b/src/generic-container/generic-container-builder.ts @@ -9,7 +9,7 @@ import { getDockerfileImages } from "../dockerfile-parser"; import { buildImage } from "../docker/functions/image/build-image"; import { getAuthConfig } from "../registry-auth-locator/get-auth-config"; import { GenericContainer } from "./generic-container"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; import { imageExists } from "../docker/functions/image/image-exists"; export class GenericContainerBuilder { diff --git a/src/generic-container/generic-container.ts b/src/generic-container/generic-container.ts index 002319f08..44d674381 100644 --- a/src/generic-container/generic-container.ts +++ b/src/generic-container/generic-container.ts @@ -24,7 +24,7 @@ import { import { pullImage } from "../docker/functions/image/pull-image"; import { createContainer, CreateContainerOptions } from "../docker/functions/container/create-container"; import { connectNetwork } from "../docker/functions/network/connect-network"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; import { inspectContainer, InspectResult } from "../docker/functions/container/inspect-container"; import Dockerode from "dockerode"; import { startContainer } from "../docker/functions/container/start-container"; diff --git a/src/generic-container/started-generic-container.ts b/src/generic-container/started-generic-container.ts index 9971dd591..3a915d764 100644 --- a/src/generic-container/started-generic-container.ts +++ b/src/generic-container/started-generic-container.ts @@ -13,7 +13,7 @@ import { stopContainer } from "../docker/functions/container/stop-container"; import { restartContainer } from "../docker/functions/container/restart-container"; import { WaitStrategy } from "../wait-strategy/wait-strategy"; import { waitForContainer } from "../wait-for-container"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; import AsyncLock from "async-lock"; export class StartedGenericContainer implements StartedTestContainer { diff --git a/src/port-check.ts b/src/port-check.ts index e2a3410cc..dd188ee3b 100644 --- a/src/port-check.ts +++ b/src/port-check.ts @@ -2,7 +2,7 @@ import { Socket } from "net"; import { execContainer } from "./docker/functions/container/exec-container"; import { log } from "./logger"; import Dockerode from "dockerode"; -import { Provider } from "./docker/docker-client"; +import { Provider } from "./docker/client/docker-client"; export interface PortCheck { isBound(port: number): Promise; diff --git a/src/port-forwarder.ts b/src/port-forwarder.ts index a550065b8..a31a39366 100644 --- a/src/port-forwarder.ts +++ b/src/port-forwarder.ts @@ -5,7 +5,7 @@ import { PortWithOptionalBinding } from "./port"; import { StartedTestContainer } from "./test-container"; import { RandomUuid } from "./uuid"; import { sessionId } from "./docker/session-id"; -import { dockerClient } from "./docker/docker-client"; +import { dockerClient } from "./docker/client/docker-client"; import { SSHD_IMAGE } from "./images"; export class PortForwarder { diff --git a/src/reaper.ts b/src/reaper.ts index 28e628904..0f935362a 100644 --- a/src/reaper.ts +++ b/src/reaper.ts @@ -8,8 +8,8 @@ import { getContainerPort, PortWithOptionalBinding } from "./port"; import { LABEL_TESTCONTAINERS_SESSION_ID } from "./labels"; import { Wait } from "./wait-strategy/wait"; import { IntervalRetryStrategy } from "./retry-strategy"; -import { getRemoteDockerUnixSocketPath } from "./docker/get-remote-docker-unix-socket-path"; -import { dockerClient } from "./docker/docker-client"; +import { getRemoteDockerUnixSocketPath } from "./docker/remote-docker-unix-socket-path"; +import { dockerClient } from "./docker/client/docker-client"; export interface Reaper { addProject(projectName: string): void; diff --git a/src/test-helper.ts b/src/test-helper.ts index aea80cc7c..fcf7111b3 100644 --- a/src/test-helper.ts +++ b/src/test-helper.ts @@ -1,6 +1,6 @@ import { Readable } from "stream"; import { ReaperInstance } from "./reaper"; -import { dockerClient } from "./docker/docker-client"; +import { dockerClient } from "./docker/client/docker-client"; import { StartedDockerComposeEnvironment } from "./docker-compose-environment/started-docker-compose-environment"; import fetch from "node-fetch"; import { StartedTestContainer } from "./test-container"; diff --git a/src/wait-strategy/host-port-wait-strategy.ts b/src/wait-strategy/host-port-wait-strategy.ts index f9dbb8614..f3f2ad65d 100644 --- a/src/wait-strategy/host-port-wait-strategy.ts +++ b/src/wait-strategy/host-port-wait-strategy.ts @@ -4,7 +4,7 @@ import { BoundPorts } from "../bound-ports"; import { log } from "../logger"; import { IntervalRetryStrategy } from "../retry-strategy"; import { AbstractWaitStrategy } from "./wait-strategy"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; export class HostPortWaitStrategy extends AbstractWaitStrategy { public async waitUntilReady(container: Dockerode.Container, boundPorts: BoundPorts): Promise { diff --git a/src/wait-strategy/http-wait-strategy.ts b/src/wait-strategy/http-wait-strategy.ts index 7f57f81d4..818a9578b 100644 --- a/src/wait-strategy/http-wait-strategy.ts +++ b/src/wait-strategy/http-wait-strategy.ts @@ -4,7 +4,7 @@ import { AbstractWaitStrategy } from "./wait-strategy"; import { IntervalRetryStrategy } from "../retry-strategy"; import fetch, { Response } from "node-fetch"; import https, { Agent } from "https"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; import { log } from "../logger"; export class HttpWaitStrategy extends AbstractWaitStrategy { diff --git a/src/wait-strategy/shell-wait-strategy.ts b/src/wait-strategy/shell-wait-strategy.ts index 93b0dad76..7b2474e31 100644 --- a/src/wait-strategy/shell-wait-strategy.ts +++ b/src/wait-strategy/shell-wait-strategy.ts @@ -3,7 +3,7 @@ import { log } from "../logger"; import { AbstractWaitStrategy } from "./wait-strategy"; import { IntervalRetryStrategy } from "../retry-strategy"; import { execContainer } from "../docker/functions/container/exec-container"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; export class ShellWaitStrategy extends AbstractWaitStrategy { constructor(private readonly command: string) { diff --git a/src/wait-strategy/startup-check-strategy.ts b/src/wait-strategy/startup-check-strategy.ts index 95dd79dbd..fb102800e 100644 --- a/src/wait-strategy/startup-check-strategy.ts +++ b/src/wait-strategy/startup-check-strategy.ts @@ -1,7 +1,7 @@ import { AbstractWaitStrategy } from "./wait-strategy"; import Dockerode from "dockerode"; import { IntervalRetryStrategy } from "../retry-strategy"; -import { dockerClient } from "../docker/docker-client"; +import { dockerClient } from "../docker/client/docker-client"; import { log } from "../logger"; export type StartupStatus = "PENDING" | "SUCCESS" | "FAIL";