@hallmaster/docker.js 0.0.13 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +188 -23
- package/dist/DockerContainersAPI.d.ts +46 -0
- package/dist/DockerContainersAPI.d.ts.map +1 -0
- package/dist/DockerContainersAPI.js +138 -0
- package/dist/DockerContainersAPI.js.map +1 -0
- package/dist/DockerImagesAPI.d.ts +84 -0
- package/dist/DockerImagesAPI.d.ts.map +1 -0
- package/dist/DockerImagesAPI.js +168 -0
- package/dist/DockerImagesAPI.js.map +1 -0
- package/dist/DockerSocket.d.ts +9 -8
- package/dist/DockerSocket.d.ts.map +1 -1
- package/dist/DockerSocket.js +68 -21
- package/dist/DockerSocket.js.map +1 -1
- package/dist/index.d.ts +16 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/types/auth/DockerAuthToken.d.ts.map +1 -0
- package/dist/types/auth/DockerAuthToken.js.map +1 -0
- package/dist/types/auth/DockerRegistryCredential.d.ts +6 -0
- package/dist/types/auth/DockerRegistryCredential.d.ts.map +1 -0
- package/dist/types/auth/DockerRegistryCredential.js +2 -0
- package/dist/types/auth/DockerRegistryCredential.js.map +1 -0
- package/dist/types/containers/DockerContainer.d.ts.map +1 -0
- package/dist/types/containers/DockerContainer.js.map +1 -0
- package/dist/types/containers/DockerContainerCreated.d.ts +5 -0
- package/dist/types/containers/DockerContainerCreated.d.ts.map +1 -0
- package/dist/types/containers/DockerContainerCreated.js +2 -0
- package/dist/types/containers/DockerContainerCreated.js.map +1 -0
- package/dist/types/containers/DockerContainerCreationBody.d.ts +129 -0
- package/dist/types/containers/DockerContainerCreationBody.d.ts.map +1 -0
- package/dist/types/containers/DockerContainerCreationBody.js +2 -0
- package/dist/types/containers/DockerContainerCreationBody.js.map +1 -0
- package/dist/types/containers/DockerContainerPrune.d.ts +5 -0
- package/dist/types/containers/DockerContainerPrune.d.ts.map +1 -0
- package/dist/types/containers/DockerContainerPrune.js +2 -0
- package/dist/types/containers/DockerContainerPrune.js.map +1 -0
- package/dist/types/containers/DockerContainerStats.d.ts.map +1 -0
- package/dist/types/containers/DockerContainerStats.js.map +1 -0
- package/dist/types/containers/DockerContainerSummary.d.ts.map +1 -0
- package/dist/types/containers/DockerContainerSummary.js.map +1 -0
- package/dist/types/containers/DockerContainerTop.d.ts.map +1 -0
- package/dist/types/containers/DockerContainerTop.js.map +1 -0
- package/dist/types/images/DockerImageDeleted.d.ts +6 -0
- package/dist/types/images/DockerImageDeleted.d.ts.map +1 -0
- package/dist/types/images/DockerImageDeleted.js +2 -0
- package/dist/types/images/DockerImageDeleted.js.map +1 -0
- package/dist/types/images/DockerImageSummary.d.ts +59 -0
- package/dist/types/images/DockerImageSummary.d.ts.map +1 -0
- package/dist/types/images/DockerImageSummary.js +2 -0
- package/dist/types/images/DockerImageSummary.js.map +1 -0
- package/dist/types/system/DockerInfo.d.ts +131 -0
- package/dist/types/system/DockerInfo.d.ts.map +1 -0
- package/dist/types/system/DockerInfo.js +2 -0
- package/dist/types/system/DockerInfo.js.map +1 -0
- package/dist/types/system/DockerVersion.d.ts +33 -0
- package/dist/types/system/DockerVersion.d.ts.map +1 -0
- package/dist/types/system/DockerVersion.js +2 -0
- package/dist/types/system/DockerVersion.js.map +1 -0
- package/package.json +3 -1
- package/dist/DockerContainer.d.ts +0 -33
- package/dist/DockerContainer.d.ts.map +0 -1
- package/dist/DockerContainer.js +0 -59
- package/dist/DockerContainer.js.map +0 -1
- package/dist/types/DockerAuthToken.d.ts.map +0 -1
- package/dist/types/DockerAuthToken.js.map +0 -1
- package/dist/types/DockerContainer.d.ts.map +0 -1
- package/dist/types/DockerContainer.js.map +0 -1
- package/dist/types/DockerContainerStats.d.ts.map +0 -1
- package/dist/types/DockerContainerStats.js.map +0 -1
- package/dist/types/DockerContainerSummary.d.ts.map +0 -1
- package/dist/types/DockerContainerSummary.js.map +0 -1
- package/dist/types/DockerContainerTop.d.ts.map +0 -1
- package/dist/types/DockerContainerTop.js.map +0 -1
- /package/dist/types/{DockerAuthToken.d.ts → auth/DockerAuthToken.d.ts} +0 -0
- /package/dist/types/{DockerAuthToken.js → auth/DockerAuthToken.js} +0 -0
- /package/dist/types/{DockerContainer.d.ts → containers/DockerContainer.d.ts} +0 -0
- /package/dist/types/{DockerContainer.js → containers/DockerContainer.js} +0 -0
- /package/dist/types/{DockerContainerStats.d.ts → containers/DockerContainerStats.d.ts} +0 -0
- /package/dist/types/{DockerContainerStats.js → containers/DockerContainerStats.js} +0 -0
- /package/dist/types/{DockerContainerSummary.d.ts → containers/DockerContainerSummary.d.ts} +0 -0
- /package/dist/types/{DockerContainerSummary.js → containers/DockerContainerSummary.js} +0 -0
- /package/dist/types/{DockerContainerTop.d.ts → containers/DockerContainerTop.d.ts} +0 -0
- /package/dist/types/{DockerContainerTop.js → containers/DockerContainerTop.js} +0 -0
package/README.md
CHANGED
|
@@ -21,16 +21,7 @@ import { DockerSocket } from "@hallmaster/docker.js";
|
|
|
21
21
|
|
|
22
22
|
await socket.init(); // prepare the UNIX socket to be used
|
|
23
23
|
|
|
24
|
-
//
|
|
25
|
-
// await socket.authenticate(
|
|
26
|
-
// "ghcr.io",
|
|
27
|
-
// "github_username",
|
|
28
|
-
// "github_pat",
|
|
29
|
-
// );
|
|
30
|
-
// console.log(socket.token);
|
|
31
|
-
|
|
32
|
-
// you can get the information of the API from the socket such as the version
|
|
33
|
-
// of the Docker Engine
|
|
24
|
+
// get the information about the API (Docker Engine's version, ...)
|
|
34
25
|
console.log(await socket.info());
|
|
35
26
|
})();
|
|
36
27
|
```
|
|
@@ -38,23 +29,197 @@ import { DockerSocket } from "@hallmaster/docker.js";
|
|
|
38
29
|
Once you have instantiated the `DockerSocket` object and initialized it with the
|
|
39
30
|
`init()` method, you are ready to use it everywhere.
|
|
40
31
|
|
|
41
|
-
|
|
32
|
+
### Containers
|
|
33
|
+
|
|
34
|
+
To fetch data from containers, you may use this snippet :
|
|
42
35
|
|
|
43
36
|
```typescript
|
|
44
|
-
import {
|
|
37
|
+
import { DockerContainersAPI, DockerSocket } from "@hallmaster/docker.js";
|
|
38
|
+
|
|
39
|
+
async function sleep(ms: number): Promise<void> {
|
|
40
|
+
return new Promise<void>((resolve) => setTimeout(resolve, ms));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
(async function () {
|
|
44
|
+
const socket = new DockerSocket();
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
// ...
|
|
46
|
+
await socket.init();
|
|
48
47
|
|
|
49
|
-
|
|
48
|
+
const dockerContainersApi = new DockerContainersAPI(socket);
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
50
|
+
const containers = await dockerContainersApi.list();
|
|
51
|
+
for (const container of containers) {
|
|
52
|
+
const containerLogs = await dockerContainersApi.logs(container.Id, {
|
|
53
|
+
stdout: true,
|
|
54
|
+
stderr: true,
|
|
55
|
+
});
|
|
56
|
+
console.log("-----------");
|
|
57
|
+
console.log(`Logs for the container #${container.Id}`);
|
|
58
|
+
console.log(containerLogs);
|
|
59
|
+
console.log("-----------");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const createdContainer = await dockerContainersApi.create(
|
|
63
|
+
{
|
|
64
|
+
Image: "redis:8.2.1-bookworm",
|
|
65
|
+
Labels: {
|
|
66
|
+
"@hallmaster/docker.js": "true",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
"redis-container",
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
for (const warning of createdContainer.Warnings) {
|
|
73
|
+
console.warn(`[CONTAINER WARNING]: ${warning}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
await dockerContainersApi.start(createdContainer.Id);
|
|
77
|
+
|
|
78
|
+
await sleep(2000);
|
|
79
|
+
|
|
80
|
+
const logs = await dockerContainersApi.logs(createdContainer.Id, {
|
|
81
|
+
stderr: true,
|
|
82
|
+
stdout: true,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
console.log("--- REDIS TEST CONTAINER LOGS BEGIN ---");
|
|
86
|
+
console.log(logs);
|
|
87
|
+
console.log("--- REDIS TEST CONTAINER LOGS END ---");
|
|
88
|
+
|
|
89
|
+
console.log("Killing test container");
|
|
90
|
+
await dockerContainersApi.kill(createdContainer.Id);
|
|
91
|
+
console.log("Test container killed");
|
|
92
|
+
|
|
93
|
+
console.log("Removing test container");
|
|
94
|
+
await dockerContainersApi.remove(createdContainer.Id);
|
|
95
|
+
console.log("Test container removed");
|
|
96
|
+
|
|
97
|
+
const availableContainers = await dockerContainersApi.list({ all: true });
|
|
98
|
+
const isAnyContainerMatchingTestContainer = availableContainers.filter(
|
|
99
|
+
(container) => container.Id === createdContainer.Id,
|
|
100
|
+
);
|
|
101
|
+
if (isAnyContainerMatchingTestContainer.length === 1) {
|
|
102
|
+
console.error("The test container has not been remove properly");
|
|
103
|
+
}
|
|
59
104
|
})();
|
|
60
105
|
```
|
|
106
|
+
|
|
107
|
+
### Images
|
|
108
|
+
|
|
109
|
+
To create an image, you would use something similar to this :
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import {
|
|
113
|
+
DockerImagesAPI,
|
|
114
|
+
DockerRegistryCredential,
|
|
115
|
+
DockerSocket,
|
|
116
|
+
} from "@hallmaster/docker.js";
|
|
117
|
+
import { pack } from "tar-fs"; // create a Readable tarball for build context
|
|
118
|
+
|
|
119
|
+
(async function () {
|
|
120
|
+
const socket = new DockerSocket();
|
|
121
|
+
|
|
122
|
+
await socket.init();
|
|
123
|
+
|
|
124
|
+
const dockerImagesApi = new DockerImagesAPI(socket);
|
|
125
|
+
|
|
126
|
+
const imageName = "dockerjs-test-image";
|
|
127
|
+
const tag = "latest";
|
|
128
|
+
|
|
129
|
+
// create the Readable build context
|
|
130
|
+
const buildContext = pack("./test/context");
|
|
131
|
+
|
|
132
|
+
// build the image
|
|
133
|
+
await dockerImagesApi.build(buildContext, [], {
|
|
134
|
+
tag: `${imageName}:${tag}`,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// lookup all images
|
|
138
|
+
const images = await dockerImagesApi.list({
|
|
139
|
+
all: true,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// checks the image has been built properly
|
|
143
|
+
const dockerjsTestImage = images.filter((image) =>
|
|
144
|
+
image.RepoTags.includes(`${imageName}:${tag}`),
|
|
145
|
+
);
|
|
146
|
+
if (dockerjsTestImage.length === 0) {
|
|
147
|
+
console.error("The Docker.js test image has not been built properly");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const registryCredential: DockerRegistryCredential = {
|
|
152
|
+
serveraddress: "localhost:5001",
|
|
153
|
+
username: "admin",
|
|
154
|
+
password: "password",
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const taggedImageName = `${registryCredential.serveraddress}/${registryCredential.username}/${imageName}`;
|
|
158
|
+
|
|
159
|
+
// tag the image
|
|
160
|
+
await dockerImagesApi.tag(imageName, {
|
|
161
|
+
repo: taggedImageName,
|
|
162
|
+
tag: tag,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// push the image
|
|
166
|
+
await dockerImagesApi.push(taggedImageName, {
|
|
167
|
+
tag: tag,
|
|
168
|
+
auth: registryCredential,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// remove the image for test cleanup
|
|
172
|
+
for (const imageNameToDelete of [imageName, taggedImageName]) {
|
|
173
|
+
const deletedImages = await dockerImagesApi.remove(imageNameToDelete, {
|
|
174
|
+
force: true,
|
|
175
|
+
noPrune: false,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// make sure the image has been deleted
|
|
179
|
+
const hasBeenDeleted = deletedImages.filter(
|
|
180
|
+
(deleted) =>
|
|
181
|
+
Object.keys(deleted).includes("Untagged") &&
|
|
182
|
+
Object.keys(deleted).includes(imageNameToDelete),
|
|
183
|
+
);
|
|
184
|
+
if (!hasBeenDeleted) {
|
|
185
|
+
console.error("The Docker.js test image has not been removed properly");
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// pull an image from remote registry
|
|
191
|
+
await dockerImagesApi.create({
|
|
192
|
+
fromImage: "nginx",
|
|
193
|
+
tag: "latest",
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// pull an image from remote private registry
|
|
197
|
+
await dockerImagesApi.create({
|
|
198
|
+
fromImage: taggedImageName,
|
|
199
|
+
auth: registryCredential,
|
|
200
|
+
});
|
|
201
|
+
})().catch((e) => {
|
|
202
|
+
throw e;
|
|
203
|
+
});
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
If you want to try to push the image to a registry, use the service located in
|
|
207
|
+
the [`docker-compose.yml`](./docker-compose.yml) file. It will setup a local
|
|
208
|
+
registry.
|
|
209
|
+
|
|
210
|
+
Then, use this command to setup the credentials inside :
|
|
211
|
+
```bash
|
|
212
|
+
docker run --rm --entrypoint htpasswd httpd:2 -Bbn admin password > auth/htpasswd
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
By default, username is `admin` and password is `password`. Obviously, this is
|
|
216
|
+
not secure, it's for demonstration purpose only. Also, `identitytoken`-based
|
|
217
|
+
authentication will not work, use the `username`/`password` and `serveraddress`
|
|
218
|
+
authentication, as in the provided example
|
|
219
|
+
|
|
220
|
+
## Contributors
|
|
221
|
+
|
|
222
|
+
To contribute, there is a [`docker-compose.yml`](./docker-compose.yml) file at
|
|
223
|
+
the root of the project which contains a service called `openapi-server`. It's
|
|
224
|
+
a web server listening on port `8080` which hosts the OpenAPI specs of the REST
|
|
225
|
+
endpoints of the Docker Engine. It's an ease for development.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { DockerSocket } from "./DockerSocket.js";
|
|
2
|
+
import type { DockerContainer } from "./types/containers/DockerContainer.js";
|
|
3
|
+
import type { DockerContainerCreated } from "./types/containers/DockerContainerCreated.js";
|
|
4
|
+
import type { DockerContainerCreationBody } from "./types/containers/DockerContainerCreationBody.js";
|
|
5
|
+
import type { DockerContainerPrune } from "./types/containers/DockerContainerPrune.js";
|
|
6
|
+
import type { DockerContainerStats } from "./types/containers/DockerContainerStats.js";
|
|
7
|
+
import type { DockerContainerSummary } from "./types/containers/DockerContainerSummary.js";
|
|
8
|
+
import type { DockerContainerTop } from "./types/containers/DockerContainerTop.js";
|
|
9
|
+
export declare class DockerContainersAPI {
|
|
10
|
+
private readonly dockerSocket;
|
|
11
|
+
constructor(dockerSocket: DockerSocket);
|
|
12
|
+
list(options?: {
|
|
13
|
+
all?: boolean;
|
|
14
|
+
limit?: number;
|
|
15
|
+
size?: boolean;
|
|
16
|
+
filters?: Record<string, string[]>;
|
|
17
|
+
}): Promise<DockerContainerSummary[]>;
|
|
18
|
+
get(containerId: string, size?: boolean): Promise<DockerContainer>;
|
|
19
|
+
top(containerId: string, psArgs?: string): Promise<DockerContainerTop>;
|
|
20
|
+
logs(containerId: string, options?: {
|
|
21
|
+
follow?: boolean;
|
|
22
|
+
stdout?: boolean;
|
|
23
|
+
stderr?: boolean;
|
|
24
|
+
since?: number;
|
|
25
|
+
until?: number;
|
|
26
|
+
timestamps?: boolean;
|
|
27
|
+
tail?: number | "all";
|
|
28
|
+
}): Promise<string>;
|
|
29
|
+
stats(containerId: string, options?: {
|
|
30
|
+
stream: true;
|
|
31
|
+
oneShot?: false;
|
|
32
|
+
} | {
|
|
33
|
+
stream: false;
|
|
34
|
+
oneShot?: boolean;
|
|
35
|
+
}): Promise<DockerContainerStats>;
|
|
36
|
+
create(body: Partial<DockerContainerCreationBody>, name?: string, platform?: string): Promise<DockerContainerCreated>;
|
|
37
|
+
start(containerId: string, detachKeys?: string): Promise<void>;
|
|
38
|
+
stop(containerId: string, signal?: string, timeout?: number): Promise<void>;
|
|
39
|
+
restart(containerId: string, signal?: string, timeout?: number): Promise<void>;
|
|
40
|
+
kill(containerId: string, signal?: string): Promise<void>;
|
|
41
|
+
pause(containerId: string): Promise<void>;
|
|
42
|
+
unpause(containerId: string): Promise<void>;
|
|
43
|
+
remove(containerId: string): Promise<void>;
|
|
44
|
+
prune(filters?: Record<string, string[]>): Promise<DockerContainerPrune>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=DockerContainersAPI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerContainersAPI.d.ts","sourceRoot":"","sources":["../src/DockerContainersAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AACrG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAEnF,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAEjD,IAAI,CACR,OAAO,GAAE;QACP,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACiB,GACrD,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAiB9B,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,OAAe;IAQ9C,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,GAAE,MAAc;IAQ/C,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;KASvB;IAqBG,KAAK,CACT,WAAW,EAAE,MAAM,EACnB,OAAO,GACH;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAE,GACjC;QACE,MAAM,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;KAIvB;IAgBG,MAAM,CACV,IAAI,EAAE,OAAO,CAAC,2BAA2B,CAAC,EAC1C,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,CAAC;IA0B5B,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAsB9C,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,MAAiB,EACzB,OAAO,GAAE,MAAW;IAoBhB,OAAO,CACX,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,MAAiB,EACzB,OAAO,GAAE,MAAW;IAoBhB,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,GAAE,MAAkB;IAepD,KAAK,CAAC,WAAW,EAAE,MAAM;IAOzB,OAAO,CAAC,WAAW,EAAE,MAAM;IAO3B,MAAM,CAAC,WAAW,EAAE,MAAM;IAO1B,KAAK,CAAC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAM;CASnD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { DockerSocket } from "./DockerSocket.js";
|
|
2
|
+
export class DockerContainersAPI {
|
|
3
|
+
dockerSocket;
|
|
4
|
+
constructor(dockerSocket) {
|
|
5
|
+
this.dockerSocket = dockerSocket;
|
|
6
|
+
}
|
|
7
|
+
async list(options = { all: false, limit: 0, size: false, filters: {} }) {
|
|
8
|
+
const apiOptions = {
|
|
9
|
+
all: (options.all ?? false).toString(),
|
|
10
|
+
limit: (options.limit ?? 0).toString(),
|
|
11
|
+
size: (options.size ?? false).toString(),
|
|
12
|
+
filters: JSON.stringify(options.filters ?? {}),
|
|
13
|
+
};
|
|
14
|
+
return await this.dockerSocket.apiCall("GET", "/containers/json", {
|
|
15
|
+
query: apiOptions,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async get(containerId, size = false) {
|
|
19
|
+
return await this.dockerSocket.apiCall("GET", `/containers/${containerId}/json`, { query: { size: size.toString() } });
|
|
20
|
+
}
|
|
21
|
+
async top(containerId, psArgs = "-ef") {
|
|
22
|
+
return await this.dockerSocket.apiCall("GET", `/containers/${containerId}/top`, { query: { psArgs: psArgs } });
|
|
23
|
+
}
|
|
24
|
+
async logs(containerId, options = {
|
|
25
|
+
follow: false,
|
|
26
|
+
stdout: false,
|
|
27
|
+
stderr: false,
|
|
28
|
+
since: 0,
|
|
29
|
+
until: 0,
|
|
30
|
+
timestamps: false,
|
|
31
|
+
tail: "all",
|
|
32
|
+
}) {
|
|
33
|
+
const apiOptions = {
|
|
34
|
+
follow: (options?.follow ?? false).toString(),
|
|
35
|
+
stdout: (options?.stdout ?? false).toString(),
|
|
36
|
+
stderr: (options?.stderr ?? false).toString(),
|
|
37
|
+
since: (options?.since ?? 0).toString(),
|
|
38
|
+
until: (options?.until ?? 0).toString(),
|
|
39
|
+
timestamps: (options?.timestamps ?? false).toString(),
|
|
40
|
+
tail: (options?.tail ?? "all").toString(),
|
|
41
|
+
};
|
|
42
|
+
return await this.dockerSocket.apiCall("GET", `/containers/${containerId}/logs`, {
|
|
43
|
+
query: apiOptions,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async stats(containerId, options = {
|
|
47
|
+
stream: true,
|
|
48
|
+
oneShot: false,
|
|
49
|
+
}) {
|
|
50
|
+
const apiOptions = {
|
|
51
|
+
stream: (options.stream ?? true).toString(),
|
|
52
|
+
"one-shot": (options.oneShot ?? false).toString(),
|
|
53
|
+
};
|
|
54
|
+
return await this.dockerSocket.apiCall("GET", `/containers/${containerId}/stats`, {
|
|
55
|
+
query: apiOptions,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async create(body, name, platform) {
|
|
59
|
+
if (name !== undefined && !/^[a-zA-Z0-9][a-zA-Z0-9_\.-]+$/.test(name)) {
|
|
60
|
+
throw new Error("DockerContainerAPI: Invalid container name");
|
|
61
|
+
}
|
|
62
|
+
const apiOptions = {};
|
|
63
|
+
if (name !== undefined) {
|
|
64
|
+
apiOptions.name = name;
|
|
65
|
+
}
|
|
66
|
+
if (platform !== undefined) {
|
|
67
|
+
apiOptions.platform = platform;
|
|
68
|
+
}
|
|
69
|
+
return await this.dockerSocket.apiCall("POST", "/containers/create", {
|
|
70
|
+
body: JSON.stringify(body),
|
|
71
|
+
query: apiOptions,
|
|
72
|
+
headers: {
|
|
73
|
+
"Content-Type": "application/json",
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async start(containerId, detachKeys) {
|
|
78
|
+
if (detachKeys !== undefined &&
|
|
79
|
+
!/^(ctrl-[a-z@\^\[,_]|[a-z])$/.test(detachKeys)) {
|
|
80
|
+
throw new Error("DockerContainersAPI: Invalid detachKeys sequence");
|
|
81
|
+
}
|
|
82
|
+
const apiOptions = {};
|
|
83
|
+
if (detachKeys !== undefined) {
|
|
84
|
+
apiOptions.detachKeys = detachKeys;
|
|
85
|
+
}
|
|
86
|
+
await this.dockerSocket.apiCall("POST", `/containers/${containerId}/start`, {
|
|
87
|
+
query: apiOptions,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async stop(containerId, signal = "SIGINT", timeout = 10) {
|
|
91
|
+
const apiOptions = {};
|
|
92
|
+
if (signal !== undefined) {
|
|
93
|
+
apiOptions.signal = signal;
|
|
94
|
+
}
|
|
95
|
+
if (timeout !== undefined) {
|
|
96
|
+
apiOptions.timeout = timeout.toString();
|
|
97
|
+
}
|
|
98
|
+
await this.dockerSocket.apiCall("POST", `/containers/${containerId}/stop`, {
|
|
99
|
+
query: apiOptions,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async restart(containerId, signal = "SIGINT", timeout = 10) {
|
|
103
|
+
const apiOptions = {};
|
|
104
|
+
if (signal !== undefined) {
|
|
105
|
+
apiOptions.signal = signal;
|
|
106
|
+
}
|
|
107
|
+
if (timeout !== undefined) {
|
|
108
|
+
apiOptions.timeout = timeout.toString();
|
|
109
|
+
}
|
|
110
|
+
await this.dockerSocket.apiCall("POST", `/containers/${containerId}/restart`, {
|
|
111
|
+
query: apiOptions,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async kill(containerId, signal = "SIGKILL") {
|
|
115
|
+
const apiOptions = {};
|
|
116
|
+
if (signal !== undefined) {
|
|
117
|
+
apiOptions.signal = signal;
|
|
118
|
+
}
|
|
119
|
+
await this.dockerSocket.apiCall("POST", `/containers/${containerId}/kill`, {
|
|
120
|
+
query: apiOptions,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async pause(containerId) {
|
|
124
|
+
await this.dockerSocket.apiCall("POST", `/containers/${containerId}/pause`);
|
|
125
|
+
}
|
|
126
|
+
async unpause(containerId) {
|
|
127
|
+
await this.dockerSocket.apiCall("POST", `/containers/${containerId}/unpause`);
|
|
128
|
+
}
|
|
129
|
+
async remove(containerId) {
|
|
130
|
+
await this.dockerSocket.apiCall("DELETE", `/containers/${containerId}`);
|
|
131
|
+
}
|
|
132
|
+
async prune(filters = {}) {
|
|
133
|
+
return await this.dockerSocket.apiCall("POST", `/containers/prune`, {
|
|
134
|
+
query: { filters: JSON.stringify(filters) },
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=DockerContainersAPI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerContainersAPI.js","sourceRoot":"","sources":["../src/DockerContainersAPI.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Readable } from "node:stream";
|
|
2
|
+
import type { DockerSocket } from "./DockerSocket.js";
|
|
3
|
+
import type { DockerImageSummary } from "./types/images/DockerImageSummary.js";
|
|
4
|
+
import type { DockerRegistryCredential } from "./types/auth/DockerRegistryCredential.js";
|
|
5
|
+
import type { DockerImageDeleted } from "./types/images/DockerImageDeleted.js";
|
|
6
|
+
export declare class DockerImagesAPI {
|
|
7
|
+
private readonly dockerSocket;
|
|
8
|
+
constructor(dockerSocket: DockerSocket);
|
|
9
|
+
list(options?: {
|
|
10
|
+
all?: boolean;
|
|
11
|
+
filters?: Record<string, string[]>;
|
|
12
|
+
sharedSize?: boolean;
|
|
13
|
+
digests?: boolean;
|
|
14
|
+
manifests?: boolean;
|
|
15
|
+
}): Promise<DockerImageSummary[]>;
|
|
16
|
+
build(inputStream: Readable, // tar blob
|
|
17
|
+
registriesCredentials?: DockerRegistryCredential[], options?: {
|
|
18
|
+
dockerfile?: string;
|
|
19
|
+
tag?: string;
|
|
20
|
+
extraHosts?: string;
|
|
21
|
+
remote?: string;
|
|
22
|
+
quiet?: boolean;
|
|
23
|
+
noCache?: boolean;
|
|
24
|
+
cacheFrom?: string;
|
|
25
|
+
pull?: string;
|
|
26
|
+
rm?: boolean;
|
|
27
|
+
forceRm?: boolean;
|
|
28
|
+
memory?: number;
|
|
29
|
+
memSwap?: number;
|
|
30
|
+
cpuShares?: number;
|
|
31
|
+
cpuSetCpus?: string;
|
|
32
|
+
cpuPeriod?: number;
|
|
33
|
+
cpuQuota?: number;
|
|
34
|
+
buildArgs?: Record<string, string>;
|
|
35
|
+
shmSize?: number;
|
|
36
|
+
squash?: boolean;
|
|
37
|
+
labels?: Record<string, string>;
|
|
38
|
+
networkMode?: "bridge" | "host" | "none" | string;
|
|
39
|
+
platform?: string;
|
|
40
|
+
target?: string;
|
|
41
|
+
buildKitOutputs?: string;
|
|
42
|
+
buildKitVersion?: 1 | 2;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
remove(imageNameOrId: string, options?: {
|
|
45
|
+
force?: boolean;
|
|
46
|
+
noPrune?: boolean;
|
|
47
|
+
platforms?: string[];
|
|
48
|
+
}): Promise<DockerImageDeleted[]>;
|
|
49
|
+
push(imageName: string, // registry.example.com/myimage, don't provide a tag here
|
|
50
|
+
options?: {
|
|
51
|
+
tag: string;
|
|
52
|
+
platform?: {
|
|
53
|
+
os: string;
|
|
54
|
+
} | {
|
|
55
|
+
os: string;
|
|
56
|
+
architecture: string;
|
|
57
|
+
} | {
|
|
58
|
+
os: string;
|
|
59
|
+
architecture: string;
|
|
60
|
+
variant: string;
|
|
61
|
+
};
|
|
62
|
+
auth?: {
|
|
63
|
+
identitytoken: string;
|
|
64
|
+
} | DockerRegistryCredential;
|
|
65
|
+
}): Promise<void>;
|
|
66
|
+
tag(imageNameOrId: string, options: {
|
|
67
|
+
repo: string;
|
|
68
|
+
tag?: string;
|
|
69
|
+
}): Promise<void>;
|
|
70
|
+
create(options: {
|
|
71
|
+
fromImage?: string;
|
|
72
|
+
fromSrc?: "-" | string;
|
|
73
|
+
repo?: string;
|
|
74
|
+
tag?: string;
|
|
75
|
+
message?: string;
|
|
76
|
+
changes?: string[];
|
|
77
|
+
platform?: string;
|
|
78
|
+
inputImage?: string | Readable;
|
|
79
|
+
auth?: {
|
|
80
|
+
identitytoken: string;
|
|
81
|
+
} | DockerRegistryCredential;
|
|
82
|
+
}): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=DockerImagesAPI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerImagesAPI.d.ts","sourceRoot":"","sources":["../src/DockerImagesAPI.ts"],"names":[],"mappings":"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"}
|