From 44f1d5865a37a3f8844d8795f9c1840296ace3dc Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Tue, 7 Oct 2025 09:47:44 +0200 Subject: [PATCH] add support for TLS in docker context Signed-off-by: Nicolas De Loof --- lib/docker-client.ts | 34 ++++++++++++++++++++++------------ lib/http.ts | 6 ++++-- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/lib/docker-client.ts b/lib/docker-client.ts index 61abe06..744ca18 100644 --- a/lib/docker-client.ts +++ b/lib/docker-client.ts @@ -24,8 +24,8 @@ import type { SecureContextOptions } from 'tls'; export class DockerClient { private api: HTTPClient; - constructor(agent: http.Agent) { - this.api = new HTTPClient(agent); + constructor(agent: http.Agent, userAgent: string = 'docker/node-sdk') { + this.api = new HTTPClient(agent, userAgent); } /** @@ -37,6 +37,7 @@ export class DockerClient { static fromDockerHost( dockerHost: string, certificates?: string | SecureContextOptions, + userAgent?: string, ): Promise { return new Promise((resolve, reject) => { if (dockerHost.startsWith('unix:')) { @@ -47,7 +48,7 @@ export class DockerClient { const agent = new SocketAgent(() => net.createConnection(socketPath), ); - resolve(new DockerClient(agent)); + resolve(new DockerClient(agent, userAgent)); } catch (error) { reject( new Error( @@ -84,7 +85,7 @@ export class DockerClient { ); } - resolve(new DockerClient(agent)); + resolve(new DockerClient(agent, userAgent)); } catch (error) { reject( new Error( @@ -98,7 +99,7 @@ export class DockerClient { const agent = new SocketAgent( SSH.createSocketFactory(dockerHost), ); - resolve(new DockerClient(agent)); + resolve(new DockerClient(agent, userAgent)); } catch (error) { reject( new Error( @@ -124,6 +125,7 @@ export class DockerClient { */ static async fromDockerContext( contextName?: string, + userAgent?: string, ): Promise { // Use DOCKER_CONTEXT environment variable if contextName not provided const targetContext = contextName || process.env.DOCKER_CONTEXT; @@ -133,12 +135,10 @@ export class DockerClient { 'No context name provided and DOCKER_CONTEXT environment variable is not set', ); } - const contextsDir = path.join( - os.homedir(), - '.docker', - 'contexts', - 'meta', - ); + + const configDir = process.env.DOCKER_CONFIG || os.homedir(); + const contextsDir = path.join(configDir, '.docker', 'contexts', 'meta'); + const tlsDir = path.join(configDir, '.docker', 'contexts', 'tls'); try { // Read all directories in the contexts meta directory @@ -170,7 +170,17 @@ export class DockerClient { meta.Endpoints.docker.Host ) { const dockerHost = meta.Endpoints.docker.Host; - return DockerClient.fromDockerHost(dockerHost); + let certificates: string | undefined = + undefined; + const tls = path.join(tlsDir, contextDir); + if (fs.existsSync(tls)) { + certificates = tls; + } + return DockerClient.fromDockerHost( + dockerHost, + certificates, + userAgent, + ); } else { throw new Error( `Docker context '${targetContext}' found but has no valid Docker endpoint`, diff --git a/lib/http.ts b/lib/http.ts index f33a4e8..011f7ff 100644 --- a/lib/http.ts +++ b/lib/http.ts @@ -85,9 +85,11 @@ export interface HTTPResponse { */ export class HTTPClient { private agent: http.Agent; + private userAgent: string; - constructor(agent: http.Agent) { + constructor(agent: http.Agent, userAgent: string) { this.agent = agent; + this.userAgent = userAgent; } close() { @@ -122,7 +124,7 @@ export class HTTPClient { // Prepare headers const requestHeaders: Record = { Host: 'host', - 'User-Agent': 'node-sdk/0.0.1', + 'User-Agent': this.userAgent, Accept: accept, ...headers, };