docker-storage-gc 4.0.0 → 4.0.1
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/.versionbot/CHANGELOG.yml +19 -1
- package/CHANGELOG.md +6 -0
- package/build/docker-event-stream.d.ts +1 -2
- package/build/docker-event-stream.js +9 -5
- package/build/docker-event-stream.js.map +1 -1
- package/build/docker-image-tree.d.ts +1 -2
- package/build/docker-image-tree.js +6 -6
- package/build/docker-image-tree.js.map +1 -1
- package/build/docker.d.ts +1 -1
- package/build/docker.js +5 -6
- package/build/docker.js.map +1 -1
- package/build/index.js +67 -74
- package/build/index.js.map +1 -1
- package/lib/docker-event-stream.ts +30 -32
- package/lib/docker-image-tree.ts +7 -6
- package/lib/docker.ts +5 -6
- package/lib/index.ts +87 -95
- package/package.json +2 -2
- package/test/docker-event-stream.ts +26 -30
- package/test/docker-image-tree.ts +102 -105
- package/test/index.ts +127 -142
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
- commits:
|
|
2
|
+
- subject: Use native promises with dockerode
|
|
3
|
+
hash: e437d1b00cbde9984187cd4fcf055c307df7fcde
|
|
4
|
+
body: ""
|
|
5
|
+
footer:
|
|
6
|
+
Change-type: patch
|
|
7
|
+
change-type: patch
|
|
8
|
+
author: Pagan Gazzard
|
|
9
|
+
- subject: Convert to async/await
|
|
10
|
+
hash: e257c65cc92e0524ed7bf08465099c18c2248724
|
|
11
|
+
body: ""
|
|
12
|
+
footer:
|
|
13
|
+
Change-type: patch
|
|
14
|
+
change-type: patch
|
|
15
|
+
author: Pagan Gazzard
|
|
16
|
+
version: 4.0.1
|
|
17
|
+
title: ""
|
|
18
|
+
date: 2023-12-05T22:24:21.088Z
|
|
1
19
|
- commits:
|
|
2
20
|
- subject: Update to dockerode 3.x
|
|
3
21
|
hash: c6b5416ef2026eba121414cbd349d0717a6d3a68
|
|
@@ -15,7 +33,7 @@
|
|
|
15
33
|
author: Pagan Gazzard
|
|
16
34
|
version: 4.0.0
|
|
17
35
|
title: ""
|
|
18
|
-
date: 2023-12-04T17:
|
|
36
|
+
date: 2023-12-04T17:45:37.011Z
|
|
19
37
|
- commits:
|
|
20
38
|
- subject: Update event-stream to 4.x
|
|
21
39
|
hash: 5d60200c8c776fff5b93d3750df8603e64db3ebf
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file
|
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
6
6
|
|
|
7
|
+
# v4.0.1
|
|
8
|
+
## (2023-12-05)
|
|
9
|
+
|
|
10
|
+
* Use native promises with dockerode [Pagan Gazzard]
|
|
11
|
+
* Convert to async/await [Pagan Gazzard]
|
|
12
|
+
|
|
7
13
|
# v4.0.0
|
|
8
14
|
## (2023-12-04)
|
|
9
15
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import Bluebird from 'bluebird';
|
|
2
1
|
import * as es from 'event-stream';
|
|
3
2
|
import type Docker from 'dockerode';
|
|
4
3
|
export interface LayerMtimes {
|
|
5
4
|
[id: string]: string | number | undefined;
|
|
6
5
|
}
|
|
7
6
|
export declare const parseEventStream: (docker: Docker) => Promise<es.MapStream>;
|
|
8
|
-
export declare function dockerMtimeStream(docker: Docker):
|
|
7
|
+
export declare function dockerMtimeStream(docker: Docker): Promise<es.MapStream>;
|
|
@@ -27,7 +27,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.dockerMtimeStream = exports.parseEventStream = void 0;
|
|
30
|
-
const bluebird_1 = __importDefault(require("bluebird"));
|
|
31
30
|
const es = __importStar(require("event-stream"));
|
|
32
31
|
const JSONStream_1 = __importDefault(require("JSONStream"));
|
|
33
32
|
const IMAGE_EVENTS = ['delete', 'import', 'pull', 'push', 'tag'];
|
|
@@ -52,7 +51,8 @@ const CONTAINER_EVENTS = [
|
|
|
52
51
|
'top',
|
|
53
52
|
'unpause',
|
|
54
53
|
];
|
|
55
|
-
const parseEventStream = (docker) =>
|
|
54
|
+
const parseEventStream = async (docker) => {
|
|
55
|
+
const images = await docker.listImages({ all: true });
|
|
56
56
|
const layerMtimes = {};
|
|
57
57
|
for (const image of images) {
|
|
58
58
|
layerMtimes[image.Id] = 0;
|
|
@@ -73,10 +73,14 @@ const parseEventStream = (docker) => docker.listImages({ all: true }).then(funct
|
|
|
73
73
|
}
|
|
74
74
|
return layerMtimes;
|
|
75
75
|
}));
|
|
76
|
-
}
|
|
76
|
+
};
|
|
77
77
|
exports.parseEventStream = parseEventStream;
|
|
78
|
-
function dockerMtimeStream(docker) {
|
|
79
|
-
|
|
78
|
+
async function dockerMtimeStream(docker) {
|
|
79
|
+
const [stream, streamParser] = await Promise.all([
|
|
80
|
+
docker.getEvents(),
|
|
81
|
+
(0, exports.parseEventStream)(docker),
|
|
82
|
+
]);
|
|
83
|
+
return es.pipeline(stream, streamParser);
|
|
80
84
|
}
|
|
81
85
|
exports.dockerMtimeStream = dockerMtimeStream;
|
|
82
86
|
//# sourceMappingURL=docker-event-stream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-event-stream.js","sourceRoot":"","sources":["../lib/docker-event-stream.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"docker-event-stream.js","sourceRoot":"","sources":["../lib/docker-event-stream.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AACnC,4DAAoC;AAGpC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEjE,MAAM,gBAAgB,GAAG;IACxB,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,KAAK;IACL,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,KAAK;IACL,SAAS;CACT,CAAC;AA4BK,MAAM,gBAAgB,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IACxD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,WAAW,GAAgB,EAAE,CAAC;IAKpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,CAAC,QAAQ,CACjB,oBAAU,CAAC,KAAK,CAAC,SAAS,CAAwB,EAClD,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAe;QAC/D,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACzB,IAAI,WAAW,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;oBAC7B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;gBACxB,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,WAAW,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;YAC5B,CAAC;QACF,CAAC;aAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAC9B,CAAC;QACD,OAAO,WAAW,CAAC;IACpB,CAAC,CAAC,CACF,CAAC;AACH,CAAC,CAAC;AA5BW,QAAA,gBAAgB,oBA4B3B;AAEK,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACrD,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChD,MAAM,CAAC,SAAS,EAAE;QAClB,IAAA,wBAAgB,EAAC,MAAM,CAAC;KACxB,CAAC,CAAC;IACH,OAAO,EAAE,CAAC,QAAQ,CAAC,MAA6B,EAAE,YAAY,CAAC,CAAC;AACjE,CAAC;AAND,8CAMC"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Bluebird from 'bluebird';
|
|
2
1
|
import type Docker from 'dockerode';
|
|
3
2
|
import { LayerMtimes } from './docker-event-stream';
|
|
4
3
|
export declare const createNode: (id: string) => ImageNode;
|
|
@@ -12,4 +11,4 @@ export interface ImageNode {
|
|
|
12
11
|
isUsedByAContainer?: boolean;
|
|
13
12
|
}
|
|
14
13
|
export declare const createTree: (images: Docker.ImageInfo[], containers: Docker.ContainerInfo[], layerMtimes: LayerMtimes) => ImageNode;
|
|
15
|
-
export declare function dockerImageTree(docker: Docker, layerMtimes: LayerMtimes):
|
|
14
|
+
export declare function dockerImageTree(docker: Docker, layerMtimes: LayerMtimes): Promise<ImageNode>;
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.dockerImageTree = exports.createTree = exports.createNode = void 0;
|
|
7
|
-
const bluebird_1 = __importDefault(require("bluebird"));
|
|
8
4
|
const saneRepoAttrs = function (repoAttrs) {
|
|
9
5
|
if (repoAttrs == null) {
|
|
10
6
|
return [];
|
|
@@ -59,8 +55,12 @@ const createTree = function (images, containers, layerMtimes) {
|
|
|
59
55
|
return tree[root];
|
|
60
56
|
};
|
|
61
57
|
exports.createTree = createTree;
|
|
62
|
-
function dockerImageTree(docker, layerMtimes) {
|
|
63
|
-
|
|
58
|
+
async function dockerImageTree(docker, layerMtimes) {
|
|
59
|
+
const [images, containers] = await Promise.all([
|
|
60
|
+
docker.listImages({ all: true }),
|
|
61
|
+
docker.listContainers({ all: true }),
|
|
62
|
+
]);
|
|
63
|
+
return (0, exports.createTree)(images, containers, layerMtimes);
|
|
64
64
|
}
|
|
65
65
|
exports.dockerImageTree = dockerImageTree;
|
|
66
66
|
//# sourceMappingURL=docker-image-tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-image-tree.js","sourceRoot":"","sources":["../lib/docker-image-tree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"docker-image-tree.js","sourceRoot":"","sources":["../lib/docker-image-tree.ts"],"names":[],"mappings":"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"}
|
package/build/docker.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import Docker from 'dockerode';
|
|
2
|
-
export declare function getDocker(hostObj: Docker.DockerOptions):
|
|
2
|
+
export declare function getDocker(hostObj: Docker.DockerOptions): Docker;
|
package/build/docker.js
CHANGED
|
@@ -5,19 +5,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getDocker = void 0;
|
|
7
7
|
const dockerode_1 = __importDefault(require("dockerode"));
|
|
8
|
-
const bluebird_1 = __importDefault(require("bluebird"));
|
|
9
8
|
const lodash_1 = __importDefault(require("lodash"));
|
|
10
9
|
const getDockerConnectOpts = function (hostObj) {
|
|
11
10
|
if (!lodash_1.default.isEmpty(hostObj)) {
|
|
12
|
-
return
|
|
11
|
+
return hostObj;
|
|
13
12
|
}
|
|
14
|
-
return
|
|
13
|
+
return {
|
|
15
14
|
socketPath: '/var/run/docker.sock',
|
|
16
|
-
|
|
17
|
-
});
|
|
15
|
+
};
|
|
18
16
|
};
|
|
19
17
|
function getDocker(hostObj) {
|
|
20
|
-
|
|
18
|
+
const opts = getDockerConnectOpts(hostObj);
|
|
19
|
+
return new dockerode_1.default(opts);
|
|
21
20
|
}
|
|
22
21
|
exports.getDocker = getDocker;
|
|
23
22
|
//# sourceMappingURL=docker.js.map
|
package/build/docker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../lib/docker.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../lib/docker.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA+B;AAC/B,oDAAuB;AAEvB,MAAM,oBAAoB,GAAG,UAAU,OAA6B;IACnE,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,OAAO;QACN,UAAU,EAAE,sBAAsB;KAClC,CAAC;AACH,CAAC,CAAC;AAEF,SAAgB,SAAS,CAAC,OAA6B;IACtD,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,IAAI,mBAAM,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAHD,8BAGC"}
|
package/build/index.js
CHANGED
|
@@ -69,36 +69,30 @@ class DockerGC {
|
|
|
69
69
|
setHostname(hostname) {
|
|
70
70
|
this.host = hostname;
|
|
71
71
|
}
|
|
72
|
-
setDocker(hostObj) {
|
|
72
|
+
async setDocker(hostObj) {
|
|
73
73
|
this.currentMtimes = {};
|
|
74
|
-
hostObj = lodash_1.default.defaults({ Promise: bluebird_1.default }, hostObj);
|
|
75
74
|
this.dockerProgress = new docker_progress_1.DockerProgress({
|
|
76
75
|
docker: new dockerode_1.default(hostObj),
|
|
77
76
|
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}));
|
|
93
|
-
})
|
|
94
|
-
.then(() => {
|
|
95
|
-
});
|
|
77
|
+
const docker = (0, docker_1.getDocker)(hostObj);
|
|
78
|
+
this.docker = docker;
|
|
79
|
+
await (this.baseImagePromise = this.getDaemonArchitecture().then((arch) => {
|
|
80
|
+
switch (arch) {
|
|
81
|
+
case 'arm':
|
|
82
|
+
return 'arm32v6/alpine:3.6';
|
|
83
|
+
case 'arm64':
|
|
84
|
+
return 'arm64v8/alpine:3.6';
|
|
85
|
+
case 'amd64':
|
|
86
|
+
return 'alpine:3.6';
|
|
87
|
+
default:
|
|
88
|
+
throw new Error('Could not detect architecture of remote host');
|
|
89
|
+
}
|
|
90
|
+
}));
|
|
96
91
|
}
|
|
97
|
-
setupMtimeStream() {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
});
|
|
92
|
+
async setupMtimeStream() {
|
|
93
|
+
const stream = await (0, docker_event_stream_1.dockerMtimeStream)(this.docker);
|
|
94
|
+
stream.on('data', (layerMtimes) => {
|
|
95
|
+
this.currentMtimes = layerMtimes;
|
|
102
96
|
});
|
|
103
97
|
}
|
|
104
98
|
removeImage(image) {
|
|
@@ -108,79 +102,78 @@ class DockerGC {
|
|
|
108
102
|
}
|
|
109
103
|
tryRemoveImageBy(image, attributes, removalType) {
|
|
110
104
|
if (attributes.length > 0) {
|
|
111
|
-
return
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
.getImage(attribute)
|
|
115
|
-
.remove({ noprune: true })
|
|
116
|
-
.then(() => {
|
|
105
|
+
return (async () => {
|
|
106
|
+
for (const attribute of attributes) {
|
|
107
|
+
console.log(`[GC (${this.host}] Removing image : ${attribute} (id: ${image.id})`);
|
|
108
|
+
await this.docker.getImage(attribute).remove({ noprune: true });
|
|
117
109
|
this.metrics.emit('imageRemoved', removalType);
|
|
118
|
-
}
|
|
119
|
-
})
|
|
120
|
-
});
|
|
110
|
+
}
|
|
111
|
+
})();
|
|
121
112
|
}
|
|
122
113
|
}
|
|
123
|
-
garbageCollect(reclaimSpace, attemptAll = false) {
|
|
114
|
+
async garbageCollect(reclaimSpace, attemptAll = false) {
|
|
124
115
|
let err;
|
|
125
116
|
const startTime = process.hrtime();
|
|
126
117
|
this.metrics.emit('spaceReclaimed', reclaimSpace);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
118
|
+
const tree = await (0, docker_image_tree_1.dockerImageTree)(this.docker, this.currentMtimes);
|
|
119
|
+
const images = await getImagesToRemove(tree, reclaimSpace, this.metrics);
|
|
120
|
+
for (const image of images) {
|
|
121
|
+
try {
|
|
122
|
+
await this.removeImage(image);
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
133
125
|
this.metrics.emit('imageRemovalError', e.statusCode);
|
|
134
126
|
console.log(`[GC ${this.host}]: Failed to remove image: `, image);
|
|
135
127
|
console.log(e);
|
|
136
128
|
if (attemptAll) {
|
|
137
129
|
err ??= e;
|
|
138
|
-
return;
|
|
139
130
|
}
|
|
140
131
|
else {
|
|
141
132
|
recordGcRunTime(startTime, this.metrics);
|
|
142
133
|
throw e;
|
|
143
134
|
}
|
|
144
|
-
});
|
|
145
|
-
})
|
|
146
|
-
.then(() => {
|
|
147
|
-
recordGcRunTime(startTime, this.metrics);
|
|
148
|
-
if (err != null) {
|
|
149
|
-
throw err;
|
|
150
135
|
}
|
|
151
|
-
}
|
|
136
|
+
}
|
|
137
|
+
recordGcRunTime(startTime, this.metrics);
|
|
138
|
+
if (err != null) {
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
152
141
|
}
|
|
153
142
|
getOutput(image, command) {
|
|
154
|
-
return bluebird_1.default.using(this.runDisposer(image, command), (container) =>
|
|
155
|
-
.logs({ stdout: true, follow: true })
|
|
156
|
-
|
|
143
|
+
return bluebird_1.default.using(this.runDisposer(image, command), async (container) => {
|
|
144
|
+
const logs = await container.logs({ stdout: true, follow: true });
|
|
145
|
+
return await streamToString(logs);
|
|
146
|
+
});
|
|
157
147
|
}
|
|
158
148
|
runDisposer(image, command) {
|
|
159
149
|
const containerPromise = this.docker.run(image, command, undefined);
|
|
160
|
-
return bluebird_1.default.resolve(containerPromise.then(([, container]) => container)).disposer((container) =>
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
return bluebird_1.default.resolve(this.baseImagePromise)
|
|
164
|
-
.tap((baseImage) => {
|
|
165
|
-
return this.dockerProgress.pull(baseImage, lodash_1.default.noop);
|
|
166
|
-
})
|
|
167
|
-
.then((baseImage) => {
|
|
168
|
-
return this.getOutput(baseImage, ['/bin/df', '-B', '1', '/']);
|
|
169
|
-
})
|
|
170
|
-
.then(function (spaceStr) {
|
|
171
|
-
const lines = spaceStr.trim().split(/\r?\n/);
|
|
172
|
-
if (lines.length !== 2) {
|
|
173
|
-
throw new Error('Coult not parse df output');
|
|
174
|
-
}
|
|
175
|
-
const parts = lines[1].split(/\s+/);
|
|
176
|
-
const total = parseInt(parts[1], 10);
|
|
177
|
-
const used = parseInt(parts[2], 10);
|
|
178
|
-
const free = parseInt(parts[3], 10);
|
|
179
|
-
return { used, total, free };
|
|
150
|
+
return bluebird_1.default.resolve(containerPromise.then(([, container]) => container)).disposer(async (container) => {
|
|
151
|
+
await container.wait();
|
|
152
|
+
await container.remove();
|
|
180
153
|
});
|
|
181
154
|
}
|
|
182
|
-
|
|
183
|
-
|
|
155
|
+
async getDaemonFreeSpace() {
|
|
156
|
+
const baseImage = await this.baseImagePromise;
|
|
157
|
+
await this.dockerProgress.pull(baseImage, lodash_1.default.noop);
|
|
158
|
+
const spaceStr = await this.getOutput(baseImage, [
|
|
159
|
+
'/bin/df',
|
|
160
|
+
'-B',
|
|
161
|
+
'1',
|
|
162
|
+
'/',
|
|
163
|
+
]);
|
|
164
|
+
const lines = spaceStr.trim().split(/\r?\n/);
|
|
165
|
+
if (lines.length !== 2) {
|
|
166
|
+
throw new Error('Coult not parse df output');
|
|
167
|
+
}
|
|
168
|
+
const parts = lines[1].split(/\s+/);
|
|
169
|
+
const total = parseInt(parts[1], 10);
|
|
170
|
+
const used = parseInt(parts[2], 10);
|
|
171
|
+
const free = parseInt(parts[3], 10);
|
|
172
|
+
return { used, total, free };
|
|
173
|
+
}
|
|
174
|
+
async getDaemonArchitecture() {
|
|
175
|
+
const { Arch } = await this.docker.version();
|
|
176
|
+
return Arch;
|
|
184
177
|
}
|
|
185
178
|
}
|
|
186
179
|
exports.default = DockerGC;
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Bluebird from 'bluebird';
|
|
2
1
|
import * as es from 'event-stream';
|
|
3
2
|
import JSONStream from 'JSONStream';
|
|
4
3
|
import type Docker from 'dockerode';
|
|
@@ -53,41 +52,40 @@ interface DockerEvent {
|
|
|
53
52
|
timeNano: '1701265973112542359';
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
export const parseEventStream = (docker: Docker) =>
|
|
57
|
-
docker.listImages({ all: true })
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
55
|
+
export const parseEventStream = async (docker: Docker) => {
|
|
56
|
+
const images = await docker.listImages({ all: true });
|
|
57
|
+
const layerMtimes: LayerMtimes = {};
|
|
58
|
+
// Start off by setting all current images to an mtime of 0 as we've never seen them used
|
|
59
|
+
// If we've never seen the layer used then it's likely created before we started
|
|
60
|
+
// listening and so set the last used time to 0 as we know it should be older than
|
|
61
|
+
// anything we've seen
|
|
62
|
+
for (const image of images) {
|
|
63
|
+
layerMtimes[image.Id] = 0;
|
|
64
|
+
}
|
|
66
65
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
} else {
|
|
76
|
-
layerMtimes[id] = timeNano;
|
|
66
|
+
return es.pipeline(
|
|
67
|
+
JSONStream.parse(undefined) as any as es.MapStream,
|
|
68
|
+
es.mapSync(function ({ status, id, from, timeNano }: DockerEvent) {
|
|
69
|
+
if (IMAGE_EVENTS.includes(status)) {
|
|
70
|
+
if (status === 'delete') {
|
|
71
|
+
if (layerMtimes[id] != null) {
|
|
72
|
+
delete layerMtimes[id];
|
|
77
73
|
}
|
|
78
|
-
} else
|
|
79
|
-
layerMtimes[
|
|
74
|
+
} else {
|
|
75
|
+
layerMtimes[id] = timeNano;
|
|
80
76
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
77
|
+
} else if (CONTAINER_EVENTS.includes(status)) {
|
|
78
|
+
layerMtimes[from] = timeNano;
|
|
79
|
+
}
|
|
80
|
+
return layerMtimes;
|
|
81
|
+
}),
|
|
82
|
+
);
|
|
83
|
+
};
|
|
85
84
|
|
|
86
|
-
export function dockerMtimeStream(docker: Docker) {
|
|
87
|
-
|
|
85
|
+
export async function dockerMtimeStream(docker: Docker) {
|
|
86
|
+
const [stream, streamParser] = await Promise.all([
|
|
88
87
|
docker.getEvents(),
|
|
89
88
|
parseEventStream(docker),
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
);
|
|
89
|
+
]);
|
|
90
|
+
return es.pipeline(stream as any as es.MapStream, streamParser);
|
|
93
91
|
}
|
package/lib/docker-image-tree.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Bluebird from 'bluebird';
|
|
2
1
|
import type Docker from 'dockerode';
|
|
3
2
|
import { LayerMtimes } from './docker-event-stream';
|
|
4
3
|
|
|
@@ -84,11 +83,13 @@ export const createTree = function (
|
|
|
84
83
|
return tree[root];
|
|
85
84
|
};
|
|
86
85
|
|
|
87
|
-
export function dockerImageTree(
|
|
88
|
-
|
|
86
|
+
export async function dockerImageTree(
|
|
87
|
+
docker: Docker,
|
|
88
|
+
layerMtimes: LayerMtimes,
|
|
89
|
+
) {
|
|
90
|
+
const [images, containers] = await Promise.all([
|
|
89
91
|
docker.listImages({ all: true }),
|
|
90
92
|
docker.listContainers({ all: true }),
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
);
|
|
93
|
+
]);
|
|
94
|
+
return createTree(images, containers, layerMtimes);
|
|
94
95
|
}
|
package/lib/docker.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import Docker from 'dockerode';
|
|
2
|
-
import Bluebird from 'bluebird';
|
|
3
2
|
import _ from 'lodash';
|
|
4
3
|
|
|
5
4
|
const getDockerConnectOpts = function (hostObj: Docker.DockerOptions) {
|
|
6
5
|
if (!_.isEmpty(hostObj)) {
|
|
7
|
-
return
|
|
6
|
+
return hostObj;
|
|
8
7
|
}
|
|
9
|
-
return
|
|
8
|
+
return {
|
|
10
9
|
socketPath: '/var/run/docker.sock',
|
|
11
|
-
|
|
12
|
-
});
|
|
10
|
+
};
|
|
13
11
|
};
|
|
14
12
|
|
|
15
13
|
export function getDocker(hostObj: Docker.DockerOptions) {
|
|
16
|
-
|
|
14
|
+
const opts = getDockerConnectOpts(hostObj);
|
|
15
|
+
return new Docker(opts);
|
|
17
16
|
}
|