build-strap 3.0.0-dev.42 → 4.0.0

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.
Files changed (130) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -34
  3. package/dist/src/ant.d.ts +19 -0
  4. package/dist/src/ant.js +18 -0
  5. package/dist/src/cert.d.ts +12 -0
  6. package/dist/src/cert.js +91 -0
  7. package/dist/src/clean.d.ts +4 -0
  8. package/dist/src/clean.js +11 -0
  9. package/dist/src/copy.d.ts +7 -0
  10. package/dist/src/copy.js +53 -0
  11. package/dist/src/cp.d.ts +17 -0
  12. package/dist/src/cp.js +88 -0
  13. package/dist/src/docker.container.d.ts +73 -0
  14. package/dist/src/docker.container.js +247 -0
  15. package/dist/src/docker.d.ts +68 -0
  16. package/dist/src/docker.js +188 -0
  17. package/dist/src/docker.network.d.ts +42 -0
  18. package/dist/src/docker.network.js +85 -0
  19. package/dist/src/docker.volume.d.ts +26 -0
  20. package/dist/src/docker.volume.js +62 -0
  21. package/dist/src/dockerCleanup.d.ts +38 -0
  22. package/dist/src/dockerCleanup.js +77 -0
  23. package/dist/src/dockerCompose.d.ts +154 -0
  24. package/dist/src/dockerCompose.js +439 -0
  25. package/dist/src/fs.d.ts +5 -0
  26. package/dist/src/fs.js +38 -0
  27. package/dist/src/git.d.ts +9 -0
  28. package/dist/src/git.js +24 -0
  29. package/dist/src/index.d.ts +20 -0
  30. package/dist/src/index.js +20 -0
  31. package/dist/src/maps.d.ts +33 -0
  32. package/dist/src/maps.js +41 -0
  33. package/dist/src/npm.d.ts +35 -0
  34. package/dist/src/npm.js +104 -0
  35. package/dist/src/pkg.d.ts +33 -0
  36. package/dist/src/pkg.js +33 -0
  37. package/dist/src/publish.d.ts +27 -0
  38. package/dist/src/publish.js +57 -0
  39. package/dist/src/run.d.ts +13 -0
  40. package/dist/src/run.js +44 -0
  41. package/dist/src/tgz.d.ts +13 -0
  42. package/dist/src/tgz.js +67 -0
  43. package/dist/src/version.d.ts +34 -0
  44. package/dist/src/version.js +101 -0
  45. package/dist/src/yarn.d.ts +26 -0
  46. package/dist/src/yarn.js +75 -0
  47. package/package.json +74 -20
  48. package/ant.js +0 -43
  49. package/ant.js.flow +0 -42
  50. package/artifactory.js +0 -617
  51. package/artifactory.js.flow +0 -616
  52. package/cert.conf +0 -20
  53. package/cert.js +0 -153
  54. package/cert.js.flow +0 -152
  55. package/clean.js +0 -20
  56. package/clean.js.flow +0 -19
  57. package/copy.js +0 -80
  58. package/copy.js.flow +0 -79
  59. package/cp.js +0 -173
  60. package/cp.js.flow +0 -172
  61. package/docker.container.js +0 -390
  62. package/docker.container.js.flow +0 -389
  63. package/docker.js +0 -368
  64. package/docker.js.flow +0 -367
  65. package/docker.network.js +0 -160
  66. package/docker.network.js.flow +0 -159
  67. package/docker.volume.js +0 -136
  68. package/docker.volume.js.flow +0 -136
  69. package/dockerCleanup.js +0 -152
  70. package/dockerCleanup.js.flow +0 -151
  71. package/dockerCompose.js +0 -766
  72. package/dockerCompose.js.flow +0 -765
  73. package/flow.js +0 -21
  74. package/flow.js.flow +0 -20
  75. package/fs.js +0 -95
  76. package/fs.js.flow +0 -96
  77. package/git.js +0 -35
  78. package/git.js.flow +0 -34
  79. package/hg.js +0 -35
  80. package/hg.js.flow +0 -34
  81. package/index.js +0 -27
  82. package/index.js.flow +0 -26
  83. package/inline-resources.js +0 -158
  84. package/inline-resources.js.flow +0 -157
  85. package/maps.js +0 -112
  86. package/maps.js.flow +0 -111
  87. package/npm.js +0 -145
  88. package/npm.js.flow +0 -144
  89. package/pkg.js +0 -81
  90. package/pkg.js.flow +0 -80
  91. package/publish.js +0 -145
  92. package/publish.js.flow +0 -144
  93. package/run.js +0 -90
  94. package/run.js.flow +0 -89
  95. package/src/ant.js +0 -42
  96. package/src/artifactory.js +0 -616
  97. package/src/cert.conf +0 -20
  98. package/src/cert.js +0 -152
  99. package/src/clean.js +0 -19
  100. package/src/copy.js +0 -79
  101. package/src/cp.js +0 -172
  102. package/src/docker.container.js +0 -389
  103. package/src/docker.js +0 -367
  104. package/src/docker.network.js +0 -159
  105. package/src/docker.volume.js +0 -136
  106. package/src/dockerCleanup.js +0 -151
  107. package/src/dockerCompose.js +0 -765
  108. package/src/flow.js +0 -20
  109. package/src/fs.js +0 -96
  110. package/src/git.js +0 -34
  111. package/src/hg.js +0 -34
  112. package/src/index.js +0 -26
  113. package/src/inline-resources.js +0 -157
  114. package/src/maps.js +0 -111
  115. package/src/npm.js +0 -144
  116. package/src/pkg.js +0 -80
  117. package/src/publish.js +0 -144
  118. package/src/run.js +0 -89
  119. package/src/test.js +0 -55
  120. package/src/tgz.js +0 -101
  121. package/src/version.js +0 -141
  122. package/src/yarn.js +0 -123
  123. package/test.js +0 -56
  124. package/test.js.flow +0 -55
  125. package/tgz.js +0 -102
  126. package/tgz.js.flow +0 -101
  127. package/version.js +0 -142
  128. package/version.js.flow +0 -141
  129. package/yarn.js +0 -124
  130. package/yarn.js.flow +0 -123
package/docker.volume.js DELETED
@@ -1,136 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports._dockerVolumeInspect = _dockerVolumeInspect;exports._dockerVolumeLs = _dockerVolumeLs;exports.dockerVolumeCreate = dockerVolumeCreate;exports.dockerVolumeFind = dockerVolumeFind;exports.dockerVolumeLs = exports.dockerVolumeInspect = void 0;exports.dockerVolumeRm = dockerVolumeRm;
2
- var _throttle = _interopRequireDefault(require("lodash/throttle"));
3
- var _cp = require("./cp");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
- // calling this function in rapid succession can lead to errors.
24
- // prefer throttled version
25
- async function _dockerVolumeLs({
26
- filter } =
27
- {}) {
28
- return (
29
- await (0, _cp.spawn)('docker', ['volume', 'ls', '--format', '{{json .}}'], {
30
- captureOutput: true })).
31
-
32
-
33
- split('\n').
34
- filter((line) => !!line.trim()).
35
- map((line) => {
36
- const {
37
- Name: name,
38
- Driver: driver,
39
- Scope: scope,
40
- Labels,
41
- Mountpoint: mountPoint } =
42
- JSON.parse(line.trim());
43
-
44
- return {
45
- name,
46
- driver,
47
- scope,
48
- labels: Labels.split(',').map((l) => l.trim()),
49
- mountPoint,
50
- inspect: async () => (await dockerVolumeInspect(name))[0],
51
- rm: async () => dockerVolumeRm(name) };
52
-
53
- }).
54
- filter((v) => v.name && (typeof filter === 'function' ? filter(v) : true));
55
- }
56
-
57
- const dockerVolumeLs =
58
-
59
- (0, _throttle.default)(_dockerVolumeLs, 500, {
60
- trailing: false });exports.dockerVolumeLs = dockerVolumeLs;
61
-
62
-
63
- async function dockerVolumeFind(
64
- search,
65
- options)
66
- {
67
- return (await dockerVolumeLs(options)).find(
68
- (v) => v.name === search || v.name.startsWith(search));
69
-
70
- }
71
-
72
-
73
-
74
-
75
-
76
-
77
- async function dockerVolumeCreate(
78
- name,
79
- { labels = [], driver, driverOpts = {} } = {})
80
- {
81
- const existing = await dockerVolumeFind(name);
82
- if (existing) return existing;
83
- await (0, _cp.spawn)('docker', [
84
- 'volume',
85
- 'create',
86
- ...labels.flatMap((l) => ['--label', l]),
87
- ...(driver ? ['-d', driver] : []),
88
- ...Object.entries(driverOpts).flatMap(([k, v]) => [
89
- '-o',
90
- `${k}=${v}`]),
91
-
92
- name]);
93
-
94
- return dockerVolumeFind(name);
95
- }
96
-
97
- async function dockerVolumeRm(
98
- id,
99
- ignoreErrors = true)
100
- {
101
- const ids = Array.isArray(id) ? id : [id];
102
- try {
103
- await (0, _cp.spawn)('docker', ['volume', 'rm', ...ids]);
104
- } catch (e) {
105
- if (!ignoreErrors) {
106
- throw new Error(`Failed to remove volume(s): ${e.message}`);
107
- }
108
- }
109
- }
110
-
111
- // calling this function in rapid succession can lead to errors.
112
- // prefer throttled version
113
- async function _dockerVolumeInspect(
114
- id)
115
- {
116
- const ids = Array.isArray(id) ? id : [id];
117
- return (
118
- JSON.parse(
119
- (
120
- await (0, _cp.spawn)(
121
- 'docker',
122
- ['volume', 'inspect', '--format', '{{json .}}', ...ids],
123
- { captureOutput: true })).
124
-
125
- trim()) ||
126
- []);
127
-
128
- }
129
-
130
- const dockerVolumeInspect =
131
-
132
- (0, _throttle.default)(
133
- _dockerVolumeInspect,
134
- 500,
135
- { trailing: true });exports.dockerVolumeInspect = dockerVolumeInspect;
136
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kb2NrZXIudm9sdW1lLmpzIl0sIm5hbWVzIjpbIl9kb2NrZXJWb2x1bWVMcyIsImZpbHRlciIsImNhcHR1cmVPdXRwdXQiLCJzcGxpdCIsImxpbmUiLCJ0cmltIiwibWFwIiwiTmFtZSIsIm5hbWUiLCJEcml2ZXIiLCJkcml2ZXIiLCJTY29wZSIsInNjb3BlIiwiTGFiZWxzIiwiTW91bnRwb2ludCIsIm1vdW50UG9pbnQiLCJKU09OIiwicGFyc2UiLCJsYWJlbHMiLCJsIiwiaW5zcGVjdCIsImRvY2tlclZvbHVtZUluc3BlY3QiLCJybSIsImRvY2tlclZvbHVtZVJtIiwidiIsImRvY2tlclZvbHVtZUxzIiwidHJhaWxpbmciLCJkb2NrZXJWb2x1bWVGaW5kIiwic2VhcmNoIiwib3B0aW9ucyIsImZpbmQiLCJzdGFydHNXaXRoIiwiZG9ja2VyVm9sdW1lQ3JlYXRlIiwiZHJpdmVyT3B0cyIsImV4aXN0aW5nIiwiZmxhdE1hcCIsIk9iamVjdCIsImVudHJpZXMiLCJrIiwiaWQiLCJpZ25vcmVFcnJvcnMiLCJpZHMiLCJBcnJheSIsImlzQXJyYXkiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwiX2RvY2tlclZvbHVtZUluc3BlY3QiXSwibWFwcGluZ3MiOiI7QUFDQTtBQUNBLDBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUNBO0FBQ08sZUFBZUEsZUFBZixDQUErQjtBQUNwQ0MsRUFBQUEsTUFEb0M7QUFFWCxFQUZwQixFQUVpRDtBQUN0RCxTQUFPO0FBQ0wsUUFBTSxlQUFNLFFBQU4sRUFBZ0IsQ0FBQyxRQUFELEVBQVcsSUFBWCxFQUFpQixVQUFqQixFQUE2QixZQUE3QixDQUFoQixFQUE0RDtBQUNoRUMsSUFBQUEsYUFBYSxFQUFFLElBRGlELEVBQTVELENBREQ7OztBQUtKQyxFQUFBQSxLQUxJLENBS0UsSUFMRjtBQU1KRixFQUFBQSxNQU5JLENBTUcsQ0FBQ0csSUFBRCxLQUFVLENBQUMsQ0FBQ0EsSUFBSSxDQUFDQyxJQUFMLEVBTmY7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QSxFQUFELENBQXJDO0FBQ0EsTUFBSTtBQUNGLFVBQU0sZUFBTSxRQUFOLEVBQWdCLENBQUMsUUFBRCxFQUFXLElBQVgsRUFBaUIsR0FBR0UsR0FBcEIsQ0FBaEIsQ0FBTjtBQUNELEdBRkQsQ0FFRSxPQUFPRyxDQUFQLEVBQVU7QUFDVixRQUFJLENBQUNKLFlBQUwsRUFBbUI7QUFDakIsWUFBTSxJQUFJSyxLQUFKLENBQVcsK0JBQThCRCxDQUFDLENBQUNFLE9BQVEsRUFBbkQsQ0FBTjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRDtBQUNBO0FBQ08sZUFBZUMsb0JBQWY7QUFDTFIsRUFESztBQUVpQztBQUN0QyxRQUFNRSxHQUFHLEdBQUdDLEtBQUssQ0FBQ0MsT0FBTixDQUFjSixFQUFkLElBQW9CQSxFQUFwQixHQUF5QixDQUFDQSxFQUFELENBQXJDO0FBQ0E7QUFDRXZCLElBQUFBLElBQUksQ0FBQ0MsS0FBTDtBQUNFO0FBQ0UsVUFBTTtBQUNKLFlBREk7QUFFSixLQUFDLFFBQUQsRUFBVyxTQUFYLEVBQXNCLFVBQXRCLEVBQWtDLFlBQWxDLEVBQWdELEdBQUd3QixHQUFuRCxDQUZJO0FBR0osTUFBRXZDLGFBQWEsRUFBRSxJQUFqQixFQUhJLENBRFI7O0FBTUVHLElBQUFBLElBTkYsRUFERjtBQVFLLE1BVFA7O0FBV0Q7O0FBRU0sTUFBTWdCLG1CQUU0Qjs7QUFBRztBQUMxQzBCLG9CQUQwQztBQUUxQyxHQUYwQztBQUcxQyxFQUFFckIsUUFBUSxFQUFFLElBQVosRUFIMEMsQ0FGckMsQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnbG9kYXNoL3Rocm90dGxlJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnLi9jcCc7XG5cbnR5cGUgRG9ja2VyVm9sdW1lSW5zcGVjdE91dHB1dCA9IHtcbiAgW3N0cmluZ106IGFueSxcbn07XG5cbmV4cG9ydCB0eXBlIERvY2tlclZvbHVtZSA9IHt8XG4gIG5hbWU6IHN0cmluZyxcbiAgZHJpdmVyOiBzdHJpbmcsXG4gIHNjb3BlOiBzdHJpbmcsXG4gIGxhYmVsczogc3RyaW5nW10sXG4gIG1vdW50UG9pbnQ6IHN0cmluZyxcbiAgaW5zcGVjdDogKCkgPT4gUHJvbWlzZTxEb2NrZXJWb2x1bWVJbnNwZWN0T3V0cHV0PixcbiAgcm06ICgpID0+IFByb21pc2U8dm9pZD4sXG58fTtcblxudHlwZSBEb2NrZXJWb2x1bWVMc09wdGlvbnMgPSB7XG4gIGZpbHRlcj86ICh2b2w6IERvY2tlclZvbHVtZSkgPT4gYm9vbGVhbixcbn07XG5cbi8vIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiByYXBpZCBzdWNjZXNzaW9uIGNhbiBsZWFkIHRvIGVycm9ycy5cbi8vIHByZWZlciB0aHJvdHRsZWQgdmVyc2lvblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9kb2NrZXJWb2x1bWVMcyh7XG4gIGZpbHRlcixcbn06IERvY2tlclZvbHVtZUxzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEb2NrZXJWb2x1bWVbXT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IHNwYXduKCdkb2NrZXInLCBbJ3ZvbHVtZScsICdscycsICctLWZvcm1hdCcsICd7e2pzb24gLn19J10sIHtcbiAgICAgIGNhcHR1cmVPdXRwdXQ6IHRydWUsXG4gICAgfSlcbiAgKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiAhIWxpbmUudHJpbSgpKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgTmFtZTogbmFtZSxcbiAgICAgICAgRHJpdmVyOiBkcml2ZXIsXG4gICAgICAgIFNjb3BlOiBzY29wZSxcbiAgICAgICAgTGFiZWxzLFxuICAgICAgICBNb3VudHBvaW50OiBtb3VudFBvaW50LFxuICAgICAgfSA9IEpTT04ucGFyc2UobGluZS50cmltKCkpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkcml2ZXIsXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBsYWJlbHM6IExhYmVscy5zcGxpdCgnLCcpLm1hcCgobCkgPT4gbC50cmltKCkpLFxuICAgICAgICBtb3VudFBvaW50LFxuICAgICAgICBpbnNwZWN0OiBhc3luYyAoKSA9PiAoYXdhaXQgZG9ja2VyVm9sdW1lSW5zcGVjdChuYW1lKSlbMF0sXG4gICAgICAgIHJtOiBhc3luYyAoKSA9PiBkb2NrZXJWb2x1bWVSbShuYW1lKSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuZmlsdGVyKCh2KSA9PiB2Lm5hbWUgJiYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicgPyBmaWx0ZXIodikgOiB0cnVlKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJWb2x1bWVMczogKFxuICBEb2NrZXJWb2x1bWVMc09wdGlvbnMgfCB2b2lkLFxuKSA9PiBQcm9taXNlPERvY2tlclZvbHVtZVtdPiA9IHRocm90dGxlKF9kb2NrZXJWb2x1bWVMcywgNTAwLCB7XG4gIHRyYWlsaW5nOiBmYWxzZSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyVm9sdW1lRmluZChcbiAgc2VhcmNoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBEb2NrZXJWb2x1bWVMc09wdGlvbnMsXG4pOiBQcm9taXNlPD9Eb2NrZXJWb2x1bWU+IHtcbiAgcmV0dXJuIChhd2FpdCBkb2NrZXJWb2x1bWVMcyhvcHRpb25zKSkuZmluZChcbiAgICAodikgPT4gdi5uYW1lID09PSBzZWFyY2ggfHwgdi5uYW1lLnN0YXJ0c1dpdGgoc2VhcmNoKSxcbiAgKTtcbn1cblxuZXhwb3J0IHR5cGUgRG9ja2VyVm9sdW1lQ3JlYXRlT3B0aW9ucyA9IHt8XG4gIGxhYmVscz86IHN0cmluZ1tdLFxuICBkcml2ZXI/OiBzdHJpbmcsXG4gIGRyaXZlck9wdHM/OiB7IFtzdHJpbmddOiBzdHJpbmcgfSxcbnx9O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvY2tlclZvbHVtZUNyZWF0ZShcbiAgbmFtZTogc3RyaW5nLFxuICB7IGxhYmVscyA9IFtdLCBkcml2ZXIsIGRyaXZlck9wdHMgPSB7fSB9OiBEb2NrZXJWb2x1bWVDcmVhdGVPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPD9Eb2NrZXJWb2x1bWU+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBkb2NrZXJWb2x1bWVGaW5kKG5hbWUpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgYXdhaXQgc3Bhd24oJ2RvY2tlcicsIFtcbiAgICAndm9sdW1lJyxcbiAgICAnY3JlYXRlJyxcbiAgICAuLi5sYWJlbHMuZmxhdE1hcCgobCkgPT4gWyctLWxhYmVsJywgbF0pLFxuICAgIC4uLihkcml2ZXIgPyBbJy1kJywgZHJpdmVyXSA6IFtdKSxcbiAgICAuLi5PYmplY3QuZW50cmllcyhkcml2ZXJPcHRzKS5mbGF0TWFwKChbaywgdl0pID0+IFtcbiAgICAgICctbycsXG4gICAgICBgJHtrfT0keyh2OiBhbnkpfWAsXG4gICAgXSksXG4gICAgbmFtZSxcbiAgXSk7XG4gIHJldHVybiBkb2NrZXJWb2x1bWVGaW5kKG5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG9ja2VyVm9sdW1lUm0oXG4gIGlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgaWdub3JlRXJyb3JzOiBib29sZWFuID0gdHJ1ZSxcbikge1xuICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KGlkKSA/IGlkIDogW2lkXTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBzcGF3bignZG9ja2VyJywgWyd2b2x1bWUnLCAncm0nLCAuLi5pZHNdKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3JzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZW1vdmUgdm9sdW1lKHMpOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluIHJhcGlkIHN1Y2Nlc3Npb24gY2FuIGxlYWQgdG8gZXJyb3JzLlxuLy8gcHJlZmVyIHRocm90dGxlZCB2ZXJzaW9uXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2RvY2tlclZvbHVtZUluc3BlY3QoXG4gIGlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbik6IFByb21pc2U8RG9ja2VyVm9sdW1lSW5zcGVjdE91dHB1dFtdPiB7XG4gIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkoaWQpID8gaWQgOiBbaWRdO1xuICByZXR1cm4gKFxuICAgIEpTT04ucGFyc2UoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IHNwYXduKFxuICAgICAgICAgICdkb2NrZXInLFxuICAgICAgICAgIFsndm9sdW1lJywgJ2luc3BlY3QnLCAnLS1mb3JtYXQnLCAne3tqc29uIC59fScsIC4uLmlkc10sXG4gICAgICAgICAgeyBjYXB0dXJlT3V0cHV0OiB0cnVlIH0sXG4gICAgICAgIClcbiAgICAgICkudHJpbSgpLFxuICAgICkgfHwgW11cbiAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclZvbHVtZUluc3BlY3Q6IChcbiAgc3RyaW5nIHwgc3RyaW5nW10sXG4pID0+IFByb21pc2U8RG9ja2VyVm9sdW1lSW5zcGVjdE91dHB1dFtdPiA9IHRocm90dGxlKFxuICBfZG9ja2VyVm9sdW1lSW5zcGVjdCxcbiAgNTAwLFxuICB7IHRyYWlsaW5nOiB0cnVlIH0sXG4pO1xuIl19
@@ -1,136 +0,0 @@
1
- // @flow
2
- import throttle from 'lodash/throttle';
3
- import { spawn } from './cp';
4
-
5
- type DockerVolumeInspectOutput = {
6
- [string]: any,
7
- };
8
-
9
- export type DockerVolume = {|
10
- name: string,
11
- driver: string,
12
- scope: string,
13
- labels: string[],
14
- mountPoint: string,
15
- inspect: () => Promise<DockerVolumeInspectOutput>,
16
- rm: () => Promise<void>,
17
- |};
18
-
19
- type DockerVolumeLsOptions = {
20
- filter?: (vol: DockerVolume) => boolean,
21
- };
22
-
23
- // calling this function in rapid succession can lead to errors.
24
- // prefer throttled version
25
- export async function _dockerVolumeLs({
26
- filter,
27
- }: DockerVolumeLsOptions = {}): Promise<DockerVolume[]> {
28
- return (
29
- await spawn('docker', ['volume', 'ls', '--format', '{{json .}}'], {
30
- captureOutput: true,
31
- })
32
- )
33
- .split('\n')
34
- .filter((line) => !!line.trim())
35
- .map((line) => {
36
- const {
37
- Name: name,
38
- Driver: driver,
39
- Scope: scope,
40
- Labels,
41
- Mountpoint: mountPoint,
42
- } = JSON.parse(line.trim());
43
-
44
- return {
45
- name,
46
- driver,
47
- scope,
48
- labels: Labels.split(',').map((l) => l.trim()),
49
- mountPoint,
50
- inspect: async () => (await dockerVolumeInspect(name))[0],
51
- rm: async () => dockerVolumeRm(name),
52
- };
53
- })
54
- .filter((v) => v.name && (typeof filter === 'function' ? filter(v) : true));
55
- }
56
-
57
- export const dockerVolumeLs: (
58
- DockerVolumeLsOptions | void,
59
- ) => Promise<DockerVolume[]> = throttle(_dockerVolumeLs, 500, {
60
- trailing: false,
61
- });
62
-
63
- export async function dockerVolumeFind(
64
- search: string,
65
- options?: DockerVolumeLsOptions,
66
- ): Promise<?DockerVolume> {
67
- return (await dockerVolumeLs(options)).find(
68
- (v) => v.name === search || v.name.startsWith(search),
69
- );
70
- }
71
-
72
- export type DockerVolumeCreateOptions = {|
73
- labels?: string[],
74
- driver?: string,
75
- driverOpts?: { [string]: string },
76
- |};
77
- export async function dockerVolumeCreate(
78
- name: string,
79
- { labels = [], driver, driverOpts = {} }: DockerVolumeCreateOptions = {},
80
- ): Promise<?DockerVolume> {
81
- const existing = await dockerVolumeFind(name);
82
- if (existing) return existing;
83
- await spawn('docker', [
84
- 'volume',
85
- 'create',
86
- ...labels.flatMap((l) => ['--label', l]),
87
- ...(driver ? ['-d', driver] : []),
88
- ...Object.entries(driverOpts).flatMap(([k, v]) => [
89
- '-o',
90
- `${k}=${(v: any)}`,
91
- ]),
92
- name,
93
- ]);
94
- return dockerVolumeFind(name);
95
- }
96
-
97
- export async function dockerVolumeRm(
98
- id: string | string[],
99
- ignoreErrors: boolean = true,
100
- ) {
101
- const ids = Array.isArray(id) ? id : [id];
102
- try {
103
- await spawn('docker', ['volume', 'rm', ...ids]);
104
- } catch (e) {
105
- if (!ignoreErrors) {
106
- throw new Error(`Failed to remove volume(s): ${e.message}`);
107
- }
108
- }
109
- }
110
-
111
- // calling this function in rapid succession can lead to errors.
112
- // prefer throttled version
113
- export async function _dockerVolumeInspect(
114
- id: string | string[],
115
- ): Promise<DockerVolumeInspectOutput[]> {
116
- const ids = Array.isArray(id) ? id : [id];
117
- return (
118
- JSON.parse(
119
- (
120
- await spawn(
121
- 'docker',
122
- ['volume', 'inspect', '--format', '{{json .}}', ...ids],
123
- { captureOutput: true },
124
- )
125
- ).trim(),
126
- ) || []
127
- );
128
- }
129
-
130
- export const dockerVolumeInspect: (
131
- string | string[],
132
- ) => Promise<DockerVolumeInspectOutput[]> = throttle(
133
- _dockerVolumeInspect,
134
- 500,
135
- { trailing: true },
136
- );
package/dockerCleanup.js DELETED
@@ -1,152 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.dockerImageCleanup = exports.dockerContainerCleanup = exports.dockerCleanup = exports.default = void 0;
2
- var _uniq = _interopRequireDefault(require("lodash/uniq"));
3
- var _docker = require("./docker");
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
- var _docker2 = require("./docker.container");
12
- var _run = require("./run");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
13
-
14
- // flattens arrays of promises and/or promises for arrays
15
- // into a single array of (awaited) values
16
- const flatten = async (input) => {
17
- const result = await input;
18
- return Array.isArray(result) ?
19
- [].concat(...(await Promise.all(result.map(flatten)))) :
20
- result;
21
- };
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
- /**
33
- * Purge stopped containers
34
- */
35
- const dockerContainerCleanup = async ({
36
- dryRun = process.argv.includes('--dry-run') } =
37
- {}) => {
38
- const toClean = await (0, _docker2.dockerContainerLs)({
39
- all: true,
40
- filter: (c) => c.exited });
41
-
42
- if (dryRun) {
43
- (0, _run.buildLog)(
44
- `Containers to delete (dry run):\n ${toClean.
45
- map((c) => c.id).
46
- join('\n ')}`);
47
-
48
- } else {
49
- await Promise.all(toClean.map(async (c) => c.rm(true)));
50
- }
51
- };exports.dockerContainerCleanup = dockerContainerCleanup;
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
- /**
75
- * Purge docker images created during build process
76
- */
77
- const dockerImageCleanup = async ({
78
- repos = [(0, _docker.getDockerRepo)()],
79
- buildImageIds = [],
80
- images = [],
81
- purgeAll = process.argv.includes('--purge-all'),
82
- purgeOld = !process.argv.includes('--keep-old'),
83
- dryRun = process.argv.includes('--dry-run') } =
84
- {}) => {
85
- // only match images without a :latest tag
86
- const filterLatest = (m) =>
87
- purgeAll || !m.tag.match(/^latest(-\w+)?$/);
88
- // only match images more than an hour old, AND without a :latest* tag
89
- const filterOld = (m) =>
90
- purgeAll || filterLatest(m) && m.created < Date.now() - 1000 * 60 * 60;
91
-
92
- const uniqueList = (0, _uniq.default)([
93
- // the things that we know were just built by us
94
- // remove all tags from the given repos with a matching `buildImageIds`, except for :latest*
95
- ...(await flatten(
96
- repos.map((r) =>
97
- buildImageIds.map(async (b) => (0, _docker.getDockerTags)(b, r, true, filterLatest))))),
98
-
99
-
100
-
101
- // unconditionally delete explicitly passed images/ids
102
- ...images,
103
-
104
- // images in the given `repos` without a tag, older than 1hr
105
- ...(await flatten(
106
- repos.map(async (r) => (0, _docker.getUntaggedDockerIds)(r, filterOld)))),
107
-
108
-
109
- // images with no repo and no tag
110
- ...(
111
- await (0, _docker.dockerImages)(
112
- null,
113
- (m) => m.repository === '<none>' && m.tag === '<none>' && filterOld(m))).
114
-
115
- map((m) => m.id),
116
-
117
- // any leftover tags from prior builds (only if purgeAll or purgeOld)
118
- ...(purgeAll || purgeOld ?
119
- await flatten(
120
- repos.map(async (r) => (0, _docker.getDockerTags)(null, r, true, filterOld))) :
121
-
122
- [])]);
123
-
124
-
125
- if (dryRun) {
126
- (0, _run.buildLog)(`Images to delete (dry run):\n ${uniqueList.join('\n ')}`);
127
- } else {
128
- await (0, _docker.dockerRmi)(uniqueList, true);
129
- }
130
- };exports.dockerImageCleanup = dockerImageCleanup;
131
-
132
-
133
-
134
-
135
-
136
-
137
- /**
138
- * Purge docker images created during build process
139
- */
140
- const dockerCleanup = async ({
141
- dryRun,
142
- ...rest } =
143
- {}) => {
144
- await dockerContainerCleanup({ dryRun });
145
- await dockerImageCleanup({
146
- dryRun,
147
- ...rest });
148
-
149
- };exports.dockerCleanup = dockerCleanup;var _default =
150
-
151
- dockerCleanup;exports.default = _default;
152
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kb2NrZXJDbGVhbnVwLmpzIl0sIm5hbWVzIjpbImZsYXR0ZW4iLCJpbnB1dCIsInJlc3VsdCIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJkb2NrZXJDb250YWluZXJDbGVhbnVwIiwiZHJ5UnVuIiwicHJvY2VzcyIsImFyZ3YiLCJpbmNsdWRlcyIsInRvQ2xlYW4iLCJmaWx0ZXIiLCJjIiwiZXhpdGVkIiwiaWQiLCJqb2luIiwicm0iLCJkb2NrZXJJbWFnZUNsZWFudXAiLCJyZXBvcyIsImJ1aWxkSW1hZ2VJZHMiLCJpbWFnZXMiLCJwdXJnZUFsbCIsInB1cmdlT2xkIiwiZmlsdGVyTGF0ZXN0IiwibSIsInRhZyIsIm1hdGNoIiwiZmlsdGVyT2xkIiwiY3JlYXRlZCIsIkRhdGUiLCJub3ciLCJ1bmlxdWVMaXN0IiwiciIsImIiLCJyZXBvc2l0b3J5IiwiZG9ja2VyQ2xlYW51cCIsInJlc3QiXSwibWFwcGluZ3MiOiI7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0EsNEI7O0FBRUE7QUFDQTtBQUNBLE1BQU1BLE9BQU8sR0FBRyxPQUFPQyxLQUFQLEtBQWlCO0FBQy9CLFFBQU1DLE1BQU0sR0FBRyxNQUFNRCxLQUFyQjtBQUNBLFNBQU9FLEtBQUssQ0FBQ0MsT0FBTixDQUFjRixNQUFkO0FBQ0gsS0FBR0csTUFBSCxDQUFVLElBQUksTUFBTUMsT0FBTyxDQUFDQyxHQUFSLENBQVlMLE1BQU0sQ0FBQ00sR0FBUCxDQUFXUixPQUFYLENBQVosQ0FBVixDQUFWLENBREc7QUFFSEUsRUFBQUEsTUFGSjtBQUdELENBTEQ7Ozs7Ozs7Ozs7O0FBZ0JBO0FBQ0E7QUFDQTtBQUNPLE1BQU1PLHNCQUFzQixHQUFHLE9BQU87QUFDM0NDLEVBQUFBLE1BQU0sR0FBR0MsT0FBTyxDQUFDQyxJQUFSLENBQWFDLFFBQWIsQ0FBc0IsV0FBdEIsQ0FEa0M7QUFFVixFQUZHLEtBRUk7QUFDeEMsUUFBTUMsT0FBTyxHQUFH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QixFQUF1QixJQUF2QixFQUE2QkwsU0FBN0IsQ0FBdkIsQ0FEVyxDQURiOztBQUlBLElBSkosQ0ExQnNCLENBQUwsQ0FBbkI7OztBQWlDQSxNQUFJckIsTUFBSixFQUFZO0FBQ1YsdUJBQVUsa0NBQWlDeUIsVUFBVSxDQUFDaEIsSUFBWCxDQUFnQixNQUFoQixDQUF3QixFQUFuRTtBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sdUJBQVVnQixVQUFWLEVBQXNCLElBQXRCLENBQU47QUFDRDtBQUNGLENBckRNLEM7Ozs7Ozs7QUE0RFA7QUFDQTtBQUNBO0FBQ08sTUFBTUksYUFBYSxHQUFHLE9BQU87QUFDbEM3QixFQUFBQSxNQURrQztBQUVsQyxLQUFHOEIsSUFGK0I7QUFHVixFQUhHLEtBR0k7QUFDL0IsUUFBTS9CLHNCQUFzQixDQUFDLEVBQUVDLE1BQUYsRUFBRCxDQUE1QjtBQUNBLFFBQU1XLGtCQUFrQixDQUFDO0FBQ3ZCWCxJQUFBQSxNQUR1QjtBQUV2QixPQUFHOEIsSUFGb0IsRUFBRCxDQUF4Qjs7QUFJRCxDQVRNLEM7O0FBV1FELGEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoL3VuaXEnO1xuaW1wb3J0IHtcbiAgZG9ja2VySW1hZ2VzLFxuICBkb2NrZXJSbWksXG4gIGdldFVudGFnZ2VkRG9ja2VySWRzLFxuICBnZXREb2NrZXJUYWdzLFxuICBnZXREb2NrZXJSZXBvLFxufSBmcm9tICcuL2RvY2tlcic7XG5pbXBvcnQgdHlwZSB7IERvY2tlckltYWdlLCBEb2NrZXJJbWFnZUZpbHRlciB9IGZyb20gJy4vZG9ja2VyJztcbmltcG9ydCB7IGRvY2tlckNvbnRhaW5lckxzIH0gZnJvbSAnLi9kb2NrZXIuY29udGFpbmVyJztcbmltcG9ydCB7IGJ1aWxkTG9nIH0gZnJvbSAnLi9ydW4nO1xuXG4vLyBmbGF0dGVucyBhcnJheXMgb2YgcHJvbWlzZXMgYW5kL29yIHByb21pc2VzIGZvciBhcnJheXNcbi8vIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgKGF3YWl0ZWQpIHZhbHVlc1xuY29uc3QgZmxhdHRlbiA9IGFzeW5jIChpbnB1dCkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbnB1dDtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0KVxuICAgID8gW10uY29uY2F0KC4uLihhd2FpdCBQcm9taXNlLmFsbChyZXN1bHQubWFwKGZsYXR0ZW4pKSkpXG4gICAgOiByZXN1bHQ7XG59O1xuXG50eXBlIENvbW1vbkRvY2tlckNsZWFudXBPcHRpb25zID0ge3xcbiAgLyoqIHByaW50IG1hdGNoZWQgaXRlbXMgdG8gY29uc29sZSBpbnN0ZWFkIG9mIGRlbGV0aW5nICovXG4gIGRyeVJ1bj86IGJvb2xlYW4sXG58fTtcblxudHlwZSBEb2NrZXJDb250YWluZXJDbGVhbnVwT3B0aW9ucyA9IHt8XG4gIC4uLkNvbW1vbkRvY2tlckNsZWFudXBPcHRpb25zLFxufH07XG5cbi8qKlxuICogUHVyZ2Ugc3RvcHBlZCBjb250YWluZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBkb2NrZXJDb250YWluZXJDbGVhbnVwID0gYXN5bmMgKHtcbiAgZHJ5UnVuID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRyeS1ydW4nKSxcbn06IERvY2tlckNvbnRhaW5lckNsZWFudXBPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgdG9DbGVhbiA9IGF3YWl0IGRvY2tlckNvbnRhaW5lckxzKHtcbiAgICBhbGw6IHRydWUsXG4gICAgZmlsdGVyOiAoYykgPT4gYy5leGl0ZWQsXG4gIH0pO1xuICBpZiAoZHJ5UnVuKSB7XG4gICAgYnVpbGRMb2coXG4gICAgICBgQ29udGFpbmVycyB0byBkZWxldGUgKGRyeSBydW4pOlxcbiAgJHt0b0NsZWFuXG4gICAgICAgIC5tYXAoKGMpID0+IGMuaWQpXG4gICAgICAgIC5qb2luKCdcXG4gICcpfWAsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0b0NsZWFuLm1hcChhc3luYyAoYykgPT4gYy5ybSh0cnVlKSkpO1xuICB9XG59O1xuXG50eXBlIERvY2tlckltYWdlQ2xlYW51cE9wdGlvbnMgPSB7fFxuICAuLi5Db21tb25Eb2NrZXJDbGVhbnVwT3B0aW9ucyxcbiAgLyoqIEltYWdlIHJlcG9zaXRvcmllcyB0byBjbGVhbiAoZGVmYXVsdHMgdG8gdGhlIG9uZSBjb25maWd1cmVkIGluIHBhY2thZ2UuanNvbikgKi9cbiAgcmVwb3M/OiBzdHJpbmdbXSxcbiAgLyoqIEltYWdlIGlkcyBrbm93biB0byBiZSBwcm9kdWNlZCBieSB0aGlzIGJ1aWxkICovXG4gIGJ1aWxkSW1hZ2VJZHM/OiBzdHJpbmdbXSxcbiAgLyoqIEV4cGxpY2l0IGltYWdlIG5hbWVzL2lkcyB0byBkZWxldGUgdW5jb25kaXRpb25hbGx5ICovXG4gIGltYWdlcz86IHN0cmluZ1tdLFxuICAvKipcbiAgICogaWdub3JlIGRlZmF1bHQgZXhjbHVzaW9ucyBvZiA6bGF0ZXN0KiBhbmQgaW1hZ2VzIDwgMWhyIG9sZFxuICAgKiB0aGlzIHdpbGwgZGVsZXRlIGFsbCBpbWFnZXMgaW4gdGhlIGdpdmVuIHJlcG9zXG4gICAqL1xuICBwdXJnZUFsbD86IGJvb2xlYW4sXG4gIC8qKlxuICAgKiBsb29rcyBmb3Igb3RoZXIgYnVpbGRzIG9mIHRoZSBzYW1lIHJlcG9zXG4gICAqIHRoaXMgd2lsbCBzdGlsbCBleGNsdWRlIDpsYXRlc3QqIGFuZCBpbWFnZXMgPCAxaHIgb2xkXG4gICAqIHVzZWZ1bCB0byBjbGVhbiB1cCBhZnRlciBwYXN0IGJ1aWxkcyB0aGF0IGZhaWxlZCB0byBjbGVhbiB0aGVtc2VsdmVzIHByb3Blcmx5XG4gICAqL1xuICBwdXJnZU9sZD86IGJvb2xlYW4sXG58fTtcblxuLyoqXG4gKiBQdXJnZSBkb2NrZXIgaW1hZ2VzIGNyZWF0ZWQgZHVyaW5nIGJ1aWxkIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGNvbnN0IGRvY2tlckltYWdlQ2xlYW51cCA9IGFzeW5jICh7XG4gIHJlcG9zID0gW2dldERvY2tlclJlcG8oKV0sXG4gIGJ1aWxkSW1hZ2VJZHMgPSBbXSxcbiAgaW1hZ2VzID0gW10sXG4gIHB1cmdlQWxsID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXB1cmdlLWFsbCcpLFxuICBwdXJnZU9sZCA9ICFwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0ta2VlcC1vbGQnKSxcbiAgZHJ5UnVuID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRyeS1ydW4nKSxcbn06IERvY2tlckltYWdlQ2xlYW51cE9wdGlvbnMgPSB7fSkgPT4ge1xuICAvLyBvbmx5IG1hdGNoIGltYWdlcyB3aXRob3V0IGEgOmxhdGVzdCB0YWdcbiAgY29uc3QgZmlsdGVyTGF0ZXN0OiBEb2NrZXJJbWFnZUZpbHRlciA9IChtOiBEb2NrZXJJbWFnZSkgPT5cbiAgICBwdXJnZUFsbCB8fCAhbS50YWcubWF0Y2goL15sYXRlc3QoLVxcdyspPyQvKTtcbiAgLy8gb25seSBtYXRjaCBpbWFnZXMgbW9yZSB0aGFuIGFuIGhvdXIgb2xkLCBBTkQgd2l0aG91dCBhIDpsYXRlc3QqIHRhZ1xuICBjb25zdCBmaWx0ZXJPbGQ6IERvY2tlckltYWdlRmlsdGVyID0gKG06IERvY2tlckltYWdlKSA9PlxuICAgIHB1cmdlQWxsIHx8IChmaWx0ZXJMYXRlc3QobSkgJiYgbS5jcmVhdGVkIDwgRGF0ZS5ub3coKSAtIDEwMDAgKiA2MCAqIDYwKTtcblxuICBjb25zdCB1bmlxdWVMaXN0ID0gdW5pcShbXG4gICAgLy8gdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgd2VyZSBqdXN0IGJ1aWx0IGJ5IHVzXG4gICAgLy8gcmVtb3ZlIGFsbCB0YWdzIGZyb20gdGhlIGdpdmVuIHJlcG9zIHdpdGggYSBtYXRjaGluZyBgYnVpbGRJbWFnZUlkc2AsIGV4Y2VwdCBmb3IgOmxhdGVzdCpcbiAgICAuLi4oYXdhaXQgZmxhdHRlbihcbiAgICAgIHJlcG9zLm1hcCgocikgPT5cbiAgICAgICAgYnVpbGRJbWFnZUlkcy5tYXAoYXN5bmMgKGIpID0+IGdldERvY2tlclRhZ3MoYiwgciwgdHJ1ZSwgZmlsdGVyTGF0ZXN0KSksXG4gICAgICApLFxuICAgICkpLFxuXG4gICAgLy8gdW5jb25kaXRpb25hbGx5IGRlbGV0ZSBleHBsaWNpdGx5IHBhc3NlZCBpbWFnZXMvaWRzXG4gICAgLi4uaW1hZ2VzLFxuXG4gICAgLy8gaW1hZ2VzIGluIHRoZSBnaXZlbiBgcmVwb3NgIHdpdGhvdXQgYSB0YWcsIG9sZGVyIHRoYW4gMWhyXG4gICAgLi4uKGF3YWl0IGZsYXR0ZW4oXG4gICAgICByZXBvcy5tYXAoYXN5bmMgKHIpID0+IGdldFVudGFnZ2VkRG9ja2VySWRzKHIsIGZpbHRlck9sZCkpLFxuICAgICkpLFxuXG4gICAgLy8gaW1hZ2VzIHdpdGggbm8gcmVwbyBhbmQgbm8gdGFnXG4gICAgLi4uKFxuICAgICAgYXdhaXQgZG9ja2VySW1hZ2VzKFxuICAgICAgICBudWxsLFxuICAgICAgICAobSkgPT4gbS5yZXBvc2l0b3J5ID09PSAnPG5vbmU+JyAmJiBtLnRhZyA9PT0gJzxub25lPicgJiYgZmlsdGVyT2xkKG0pLFxuICAgICAgKVxuICAgICkubWFwKChtKSA9PiBtLmlkKSxcblxuICAgIC8vIGFueSBsZWZ0b3ZlciB0YWdzIGZyb20gcHJpb3IgYnVpbGRzIChvbmx5IGlmIHB1cmdlQWxsIG9yIHB1cmdlT2xkKVxuICAgIC4uLihwdXJnZUFsbCB8fCBwdXJnZU9sZFxuICAgICAgPyBhd2FpdCBmbGF0dGVuKFxuICAgICAgICAgIHJlcG9zLm1hcChhc3luYyAocikgPT4gZ2V0RG9ja2VyVGFncyhudWxsLCByLCB0cnVlLCBmaWx0ZXJPbGQpKSxcbiAgICAgICAgKVxuICAgICAgOiBbXSksXG4gIF0pO1xuXG4gIGlmIChkcnlSdW4pIHtcbiAgICBidWlsZExvZyhgSW1hZ2VzIHRvIGRlbGV0ZSAoZHJ5IHJ1bik6XFxuICAke3VuaXF1ZUxpc3Quam9pbignXFxuICAnKX1gKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBkb2NrZXJSbWkodW5pcXVlTGlzdCwgdHJ1ZSk7XG4gIH1cbn07XG5cbnR5cGUgRG9ja2VyQ2xlYW51cE9wdGlvbnMgPSB7fFxuICAuLi5Eb2NrZXJJbWFnZUNsZWFudXBPcHRpb25zLFxuICAuLi5Eb2NrZXJDb250YWluZXJDbGVhbnVwT3B0aW9ucyxcbnx9O1xuXG4vKipcbiAqIFB1cmdlIGRvY2tlciBpbWFnZXMgY3JlYXRlZCBkdXJpbmcgYnVpbGQgcHJvY2Vzc1xuICovXG5leHBvcnQgY29uc3QgZG9ja2VyQ2xlYW51cCA9IGFzeW5jICh7XG4gIGRyeVJ1bixcbiAgLi4ucmVzdFxufTogRG9ja2VyQ2xlYW51cE9wdGlvbnMgPSB7fSkgPT4ge1xuICBhd2FpdCBkb2NrZXJDb250YWluZXJDbGVhbnVwKHsgZHJ5UnVuIH0pO1xuICBhd2FpdCBkb2NrZXJJbWFnZUNsZWFudXAoe1xuICAgIGRyeVJ1bixcbiAgICAuLi5yZXN0LFxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRvY2tlckNsZWFudXA7XG4iXX0=
@@ -1,151 +0,0 @@
1
- // @flow
2
- import uniq from 'lodash/uniq';
3
- import {
4
- dockerImages,
5
- dockerRmi,
6
- getUntaggedDockerIds,
7
- getDockerTags,
8
- getDockerRepo,
9
- } from './docker';
10
- import type { DockerImage, DockerImageFilter } from './docker';
11
- import { dockerContainerLs } from './docker.container';
12
- import { buildLog } from './run';
13
-
14
- // flattens arrays of promises and/or promises for arrays
15
- // into a single array of (awaited) values
16
- const flatten = async (input) => {
17
- const result = await input;
18
- return Array.isArray(result)
19
- ? [].concat(...(await Promise.all(result.map(flatten))))
20
- : result;
21
- };
22
-
23
- type CommonDockerCleanupOptions = {|
24
- /** print matched items to console instead of deleting */
25
- dryRun?: boolean,
26
- |};
27
-
28
- type DockerContainerCleanupOptions = {|
29
- ...CommonDockerCleanupOptions,
30
- |};
31
-
32
- /**
33
- * Purge stopped containers
34
- */
35
- export const dockerContainerCleanup = async ({
36
- dryRun = process.argv.includes('--dry-run'),
37
- }: DockerContainerCleanupOptions = {}) => {
38
- const toClean = await dockerContainerLs({
39
- all: true,
40
- filter: (c) => c.exited,
41
- });
42
- if (dryRun) {
43
- buildLog(
44
- `Containers to delete (dry run):\n ${toClean
45
- .map((c) => c.id)
46
- .join('\n ')}`,
47
- );
48
- } else {
49
- await Promise.all(toClean.map(async (c) => c.rm(true)));
50
- }
51
- };
52
-
53
- type DockerImageCleanupOptions = {|
54
- ...CommonDockerCleanupOptions,
55
- /** Image repositories to clean (defaults to the one configured in package.json) */
56
- repos?: string[],
57
- /** Image ids known to be produced by this build */
58
- buildImageIds?: string[],
59
- /** Explicit image names/ids to delete unconditionally */
60
- images?: string[],
61
- /**
62
- * ignore default exclusions of :latest* and images < 1hr old
63
- * this will delete all images in the given repos
64
- */
65
- purgeAll?: boolean,
66
- /**
67
- * looks for other builds of the same repos
68
- * this will still exclude :latest* and images < 1hr old
69
- * useful to clean up after past builds that failed to clean themselves properly
70
- */
71
- purgeOld?: boolean,
72
- |};
73
-
74
- /**
75
- * Purge docker images created during build process
76
- */
77
- export const dockerImageCleanup = async ({
78
- repos = [getDockerRepo()],
79
- buildImageIds = [],
80
- images = [],
81
- purgeAll = process.argv.includes('--purge-all'),
82
- purgeOld = !process.argv.includes('--keep-old'),
83
- dryRun = process.argv.includes('--dry-run'),
84
- }: DockerImageCleanupOptions = {}) => {
85
- // only match images without a :latest tag
86
- const filterLatest: DockerImageFilter = (m: DockerImage) =>
87
- purgeAll || !m.tag.match(/^latest(-\w+)?$/);
88
- // only match images more than an hour old, AND without a :latest* tag
89
- const filterOld: DockerImageFilter = (m: DockerImage) =>
90
- purgeAll || (filterLatest(m) && m.created < Date.now() - 1000 * 60 * 60);
91
-
92
- const uniqueList = uniq([
93
- // the things that we know were just built by us
94
- // remove all tags from the given repos with a matching `buildImageIds`, except for :latest*
95
- ...(await flatten(
96
- repos.map((r) =>
97
- buildImageIds.map(async (b) => getDockerTags(b, r, true, filterLatest)),
98
- ),
99
- )),
100
-
101
- // unconditionally delete explicitly passed images/ids
102
- ...images,
103
-
104
- // images in the given `repos` without a tag, older than 1hr
105
- ...(await flatten(
106
- repos.map(async (r) => getUntaggedDockerIds(r, filterOld)),
107
- )),
108
-
109
- // images with no repo and no tag
110
- ...(
111
- await dockerImages(
112
- null,
113
- (m) => m.repository === '<none>' && m.tag === '<none>' && filterOld(m),
114
- )
115
- ).map((m) => m.id),
116
-
117
- // any leftover tags from prior builds (only if purgeAll or purgeOld)
118
- ...(purgeAll || purgeOld
119
- ? await flatten(
120
- repos.map(async (r) => getDockerTags(null, r, true, filterOld)),
121
- )
122
- : []),
123
- ]);
124
-
125
- if (dryRun) {
126
- buildLog(`Images to delete (dry run):\n ${uniqueList.join('\n ')}`);
127
- } else {
128
- await dockerRmi(uniqueList, true);
129
- }
130
- };
131
-
132
- type DockerCleanupOptions = {|
133
- ...DockerImageCleanupOptions,
134
- ...DockerContainerCleanupOptions,
135
- |};
136
-
137
- /**
138
- * Purge docker images created during build process
139
- */
140
- export const dockerCleanup = async ({
141
- dryRun,
142
- ...rest
143
- }: DockerCleanupOptions = {}) => {
144
- await dockerContainerCleanup({ dryRun });
145
- await dockerImageCleanup({
146
- dryRun,
147
- ...rest,
148
- });
149
- };
150
-
151
- export default dockerCleanup;