docker-client-mx 1.40.0 → 1.42.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.
- package/dist/docker-desktop-mx/browser/{chunk-CpVmilfG.js → chunk-3VyqMz_T.js} +2 -2
- package/dist/docker-desktop-mx/browser/{chunk-Doow6WqE.js → chunk-BW20bBdg.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-Ba_z6LGV.js +1 -0
- package/dist/docker-desktop-mx/browser/chunk-BdOOWVGY.js +4 -0
- package/dist/docker-desktop-mx/browser/chunk-BgNCBUvw2.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-D4dQfTTc.js → chunk-BoN9ZlqT.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-BsAqguck2.js +3 -0
- package/dist/docker-desktop-mx/browser/{chunk-Bw7Mtap6.js → chunk-Bx2_SrZM.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-CZNcOfBu2.js → chunk-C-yEXU2P.js} +2 -2
- package/dist/docker-desktop-mx/browser/chunk-C1Wg9uje.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-CC_wIdx2.js → chunk-C22Z7vgK.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-C6u6rXYb2.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-Ch8nHKqR.js → chunk-CC84vXik.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-DdFeg3-c.js → chunk-CI9I9Npi.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-DBPVGjlB.js → chunk-CMrtklQ1.js} +2 -2
- package/dist/docker-desktop-mx/browser/{chunk-wVwXBw1N.js → chunk-CRNeTD5E.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-5jLUVNg7.js → chunk-CSrKHPxR.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-Dz9ZDzia.js → chunk-CT1ZUgmS.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-CWusqRG0.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-8P32TlCt.js → chunk-Cbit44lz.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-Cc4_zCxe2.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-BH9xkVLp.js → chunk-Ckq_aT3A.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-BEAPEQBM.js → chunk-CrBxmi_g.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-D-7d5O7f.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-CP90rR4k.js → chunk-D0xC_xVf.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-D29s9m84.js +1 -0
- package/dist/docker-desktop-mx/browser/chunk-DKpHNjiv.js +1 -0
- package/dist/docker-desktop-mx/browser/chunk-DLeqF0uQ.js +1 -0
- package/dist/docker-desktop-mx/browser/chunk-DZjRtM2K.js +1 -0
- package/dist/docker-desktop-mx/browser/chunk-DsuW5Ksa2.js +1 -0
- package/dist/docker-desktop-mx/browser/chunk-DvoPI4MU.js +1 -0
- package/dist/docker-desktop-mx/browser/chunk-DzG5R5Kk.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-fqYbS3e-.js → chunk-KUYJNmP22.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-QaMufr3I.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-MpnWAfxv.js → chunk-V7ftX_10.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-Bn40KMmY.js → chunk-Zcfhi-RM.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-CiOk-qoT.js → chunk-Zom3ankA.js} +1 -1
- package/dist/docker-desktop-mx/browser/{chunk-DKNRYU3y.js → chunk-cYufOe8J.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-eG8Su12W.js +1 -0
- package/dist/docker-desktop-mx/browser/chunk-ep62jwHG.js +1 -0
- package/dist/docker-desktop-mx/browser/{chunk-Di8ZOBwa.js → chunk-iwVkNYYA.js} +1 -1
- package/dist/docker-desktop-mx/browser/chunk-wa_VZZFY.js +1 -0
- package/dist/docker-desktop-mx/browser/index.html +2 -2
- package/dist/docker-desktop-mx/browser/main-DECBD64Q.js +1 -0
- package/dist/docker-desktop-mx/browser/styles-5TXFXUUF.css +1 -0
- package/dist-electron/auto-prune.js +76 -0
- package/dist-electron/auto-prune.js.map +1 -0
- package/dist-electron/channels.js +9 -0
- package/dist-electron/channels.js.map +1 -1
- package/dist-electron/container-commit.js +39 -0
- package/dist-electron/container-commit.js.map +1 -0
- package/dist-electron/container-rename.js +63 -0
- package/dist-electron/container-rename.js.map +1 -0
- package/dist-electron/environment.js +52 -0
- package/dist-electron/environment.js.map +1 -0
- package/dist-electron/image-reference.js +92 -0
- package/dist-electron/image-reference.js.map +1 -0
- package/dist-electron/image-tags.js +138 -0
- package/dist-electron/image-tags.js.map +1 -0
- package/dist-electron/images.js +2 -17
- package/dist-electron/images.js.map +1 -1
- package/dist-electron/ipc.js +26 -0
- package/dist-electron/ipc.js.map +1 -1
- package/dist-electron/main.js +34 -0
- package/dist-electron/main.js.map +1 -1
- package/dist-electron/preload.js +18 -1
- package/dist-electron/preload.js.map +1 -1
- package/dist-electron/pull.js +20 -12
- package/dist-electron/pull.js.map +1 -1
- package/dist-electron/redact.js +9 -0
- package/dist-electron/redact.js.map +1 -1
- package/dist-electron/renew.js +2 -2
- package/dist-electron/renew.js.map +1 -1
- package/dist-electron/settings.js +22 -0
- package/dist-electron/settings.js.map +1 -1
- package/dist-electron/volume-backup.js +16 -3
- package/dist-electron/volume-backup.js.map +1 -1
- package/dist-electron/volume-copy.js +145 -0
- package/dist-electron/volume-copy.js.map +1 -0
- package/package.json +1 -1
- package/dist/docker-desktop-mx/browser/chunk-7fAa0H9l2.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-BMXieIjc.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-BfC3KqGQ.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-CC7DUrLR.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-CHFuuSv8.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-CaYY-6hH.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-CmtjDUsV.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-CzrtYwlw.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-D0pCyzqb.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-DAgdneMS.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-DEsPgcXV.js +0 -4
- package/dist/docker-desktop-mx/browser/chunk-DFhjd8-d2.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-DGtAiSbg.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-DLh60Eif.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-Dq9pgyA42.js +0 -2
- package/dist/docker-desktop-mx/browser/chunk-Ds9stAVj.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-lLCuDcp6.js +0 -1
- package/dist/docker-desktop-mx/browser/chunk-nped2UPz.js +0 -1
- package/dist/docker-desktop-mx/browser/main-HUWYR6IC.js +0 -1
- package/dist/docker-desktop-mx/browser/styles-D7Y5N7JX.css +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toEnvironment = toEnvironment;
|
|
4
|
+
exports.readEnvironment = readEnvironment;
|
|
5
|
+
const docker_client_1 = require("./docker-client");
|
|
6
|
+
const redact_1 = require("./redact");
|
|
7
|
+
/**
|
|
8
|
+
* De omgevingsvariabelen van een container, voor de tab Omgeving (fase 64).
|
|
9
|
+
*
|
|
10
|
+
* In inspect staan ze als één lijst `NAAM=waarde`, met alles door elkaar: wat de image zet (`PATH`,
|
|
11
|
+
* `NGINX_VERSION`) en wat bij het starten meegegeven is. Hier staat per variabele waar hij vandaan
|
|
12
|
+
* komt, want "zo heb ik hem gestart" is meestal waar je naar zoekt.
|
|
13
|
+
*
|
|
14
|
+
* De waarden gaan naar de renderer, zoals bij het run-commando (fase 24): de tab toont ze pas als je
|
|
15
|
+
* erop klikt. Alleen lezen; een variabele veranderen kan alleen met een nieuwe container.
|
|
16
|
+
*/
|
|
17
|
+
function split(entry) {
|
|
18
|
+
const equals = entry.indexOf('=');
|
|
19
|
+
return equals === -1 ? [entry, ''] : [entry.slice(0, equals), entry.slice(equals + 1)];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Per variabele de naam, de waarde, en waar hij vandaan komt: uit de image, meegegeven bij het
|
|
23
|
+
* starten, of meegegeven over een waarde van de image heen. Op naam gesorteerd.
|
|
24
|
+
*/
|
|
25
|
+
function toEnvironment(container, image) {
|
|
26
|
+
const fromImage = new Map(image.map(split));
|
|
27
|
+
return container
|
|
28
|
+
.map((entry) => {
|
|
29
|
+
const [name, value] = split(entry);
|
|
30
|
+
const original = fromImage.get(name);
|
|
31
|
+
const source = original === undefined ? 'set' : original === value ? 'image' : 'changed';
|
|
32
|
+
return { name, value, source, secret: (0, redact_1.looksSecret)(name, value) };
|
|
33
|
+
})
|
|
34
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
35
|
+
}
|
|
36
|
+
/** De variabelen van deze container, met de image erbij om te zien wat daar vandaan komt. */
|
|
37
|
+
async function readEnvironment(id) {
|
|
38
|
+
try {
|
|
39
|
+
const { docker } = (0, docker_client_1.getConnection)();
|
|
40
|
+
const container = (await docker.getContainer(id).inspect());
|
|
41
|
+
// Een image die intussen weg is, maakt het verschil onbekend; dan telt alles als meegegeven.
|
|
42
|
+
const image = (await docker
|
|
43
|
+
.getImage(container.Image ?? '')
|
|
44
|
+
.inspect()
|
|
45
|
+
.catch(() => null));
|
|
46
|
+
return { ok: true, variables: toEnvironment(container.Config?.Env ?? [], image?.Config?.Env ?? []) };
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
return { ok: false, problem: (0, docker_client_1.readableError)(err, (0, docker_client_1.getConnection)().endpoint).message };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../electron/environment.ts"],"names":[],"mappings":";;AA0BA,sCAaC;AAGD,0CAeC;AAxDD,mDAA+D;AAC/D,qCAAuC;AAEvC;;;;;;;;;GASG;AAEH,SAAS,KAAK,CAAC,KAAa;IAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAElC,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,SAA4B,EAAE,KAAwB;IAElF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAE5C,OAAO,SAAS;SACb,GAAG,CAAC,CAAC,KAAK,EAAuB,EAAE;QAClC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAEzF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAA,oBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;IACnE,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,6FAA6F;AACtF,KAAK,UAAU,eAAe,CAAC,EAAU;IAE9C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAa,GAAE,CAAC;QACnC,MAAM,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAsE,CAAC;QACjI,6FAA6F;QAC7F,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM;aACxB,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;aAC/B,OAAO,EAAE;aACT,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAkD,CAAC;QAEvE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;IACvG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAA,6BAAa,EAAC,GAAG,EAAE,IAAA,6BAAa,GAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;IACtF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Image-referenties als tekst: splitsen, controleren en een naam voorstellen.
|
|
4
|
+
*
|
|
5
|
+
* Zonder imports, zodat de renderer dezelfde controle kan doen als main voordat hij iets vraagt
|
|
6
|
+
* (fase 68, en straks taggen in fase 69).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.splitReference = splitReference;
|
|
10
|
+
exports.isRepository = isRepository;
|
|
11
|
+
exports.registryHost = registryHost;
|
|
12
|
+
exports.isTag = isTag;
|
|
13
|
+
exports.isReference = isReference;
|
|
14
|
+
exports.suggestImageName = suggestImageName;
|
|
15
|
+
/** Een deel van het pad: kleine letters en cijfers, met `.`, `_`, `__` of streepjes ertussen. */
|
|
16
|
+
const COMPONENT = '[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*';
|
|
17
|
+
/** Een registry: een hostnaam met punten, of `localhost`, eventueel met een poort. */
|
|
18
|
+
const DOMAIN = '(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*(?::[0-9]+)?';
|
|
19
|
+
const TAG = /^\w[\w.-]{0,127}$/;
|
|
20
|
+
const PATH = new RegExp(`^${COMPONENT}(?:/${COMPONENT})*$`);
|
|
21
|
+
const HOST = new RegExp(`^${DOMAIN}$`);
|
|
22
|
+
/**
|
|
23
|
+
* Splitst een referentie in repository en tag.
|
|
24
|
+
*
|
|
25
|
+
* Op de laatste dubbele punt ná de laatste slash, want een registry mag een poort hebben:
|
|
26
|
+
* in `localhost:5000/app:1.0` hoort `:5000` bij de host en `:1.0` is de tag. Splitsen op de
|
|
27
|
+
* eerste of op elke dubbele punt gaat daar mis.
|
|
28
|
+
*/
|
|
29
|
+
function splitReference(reference) {
|
|
30
|
+
const slash = reference.lastIndexOf('/');
|
|
31
|
+
const colon = reference.lastIndexOf(':');
|
|
32
|
+
if (colon > slash) {
|
|
33
|
+
return { repository: reference.slice(0, colon), tag: reference.slice(colon + 1) };
|
|
34
|
+
}
|
|
35
|
+
return { repository: reference, tag: 'latest' };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Of Docker dit als repository aanneemt: `mysql`, `mijn/app`, `localhost:5000/app`. Het eerste
|
|
39
|
+
* deel is een registry als er een punt of poort in zit, of als het `localhost` is; anders hoort
|
|
40
|
+
* het bij het pad, en dat moet in kleine letters.
|
|
41
|
+
*/
|
|
42
|
+
function isRepository(repository) {
|
|
43
|
+
if (repository.length === 0 || repository.length > 255) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const slash = repository.indexOf('/');
|
|
47
|
+
const first = slash === -1 ? repository : repository.slice(0, slash);
|
|
48
|
+
const isHost = slash !== -1 && (first.includes('.') || first.includes(':') || first === 'localhost');
|
|
49
|
+
if (isHost) {
|
|
50
|
+
return HOST.test(first) && PATH.test(repository.slice(slash + 1));
|
|
51
|
+
}
|
|
52
|
+
return PATH.test(repository);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Naar welke registry een referentie wijst, of `null` voor Docker Hub. Dezelfde regel als
|
|
56
|
+
* `registryOf` in registry-auth.ts: het eerste deel is alleen een registry met een punt of poort
|
|
57
|
+
* erin, of als het `localhost` is. Dit is de versie zonder imports, voor de renderer.
|
|
58
|
+
*/
|
|
59
|
+
function registryHost(reference) {
|
|
60
|
+
const slash = reference.indexOf('/');
|
|
61
|
+
const first = slash === -1 ? '' : reference.slice(0, slash);
|
|
62
|
+
if (slash === -1 || !(first.includes('.') || first.includes(':') || first === 'localhost')) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return first === 'docker.io' || first === 'index.docker.io' ? null : first;
|
|
66
|
+
}
|
|
67
|
+
/** Of Docker dit als tag aanneemt: letters, cijfers, `_`, `.` en `-`, hooguit 128 tekens. */
|
|
68
|
+
function isTag(tag) {
|
|
69
|
+
return TAG.test(tag);
|
|
70
|
+
}
|
|
71
|
+
/** Een hele referentie met tag, zoals `mysql-aangepast:8.4`; zonder tag telt als `latest`. */
|
|
72
|
+
function isReference(reference) {
|
|
73
|
+
const { repository, tag } = splitReference(reference);
|
|
74
|
+
return isRepository(repository) && isTag(tag);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Een naam voor een image uit een container: de repository van zijn image met een achtervoegsel,
|
|
78
|
+
* en dezelfde tag. Draait de container op een kale image-id, dan de naam van de container.
|
|
79
|
+
*/
|
|
80
|
+
function suggestImageName(image, container, suffix) {
|
|
81
|
+
const bare = image.replace(/@sha256:[0-9a-f]+$/, '');
|
|
82
|
+
if (!/^(sha256:)?[0-9a-f]{12,64}$/.test(bare)) {
|
|
83
|
+
const { repository, tag } = splitReference(bare);
|
|
84
|
+
const suggestion = `${repository}${suffix}:${tag}`;
|
|
85
|
+
if (isReference(suggestion)) {
|
|
86
|
+
return suggestion;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const name = container.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/^[^a-z0-9]+/, '');
|
|
90
|
+
return `${name || 'container'}${suffix}:latest`;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=image-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-reference.js","sourceRoot":"","sources":["../electron/image-reference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tagImage = tagImage;
|
|
4
|
+
exports.untagImage = untagImage;
|
|
5
|
+
exports.describePushProblem = describePushProblem;
|
|
6
|
+
exports.openPushStream = openPushStream;
|
|
7
|
+
const docker_client_1 = require("./docker-client");
|
|
8
|
+
const i18n_1 = require("./i18n");
|
|
9
|
+
const image_reference_1 = require("./image-reference");
|
|
10
|
+
const pull_1 = require("./pull");
|
|
11
|
+
const registry_auth_1 = require("./registry-auth");
|
|
12
|
+
/**
|
|
13
|
+
* Een image taggen, een tag weghalen en pushen (fase 69).
|
|
14
|
+
*
|
|
15
|
+
* Pushen gaat met de gegevens van `docker login`, net als pullen uit een privé-registry (fase 12),
|
|
16
|
+
* en de voortgang komt in dezelfde vorm: één regel per laag. De renderer vraagt eerst om een
|
|
17
|
+
* bevestiging die de registry noemt; een push is niet terug te draaien.
|
|
18
|
+
*/
|
|
19
|
+
/** Geeft `source` er een tag bij. Bestaat `target` al, dan gaat die tag naar deze image, zoals bij `docker tag`. */
|
|
20
|
+
async function tagImage(source, target) {
|
|
21
|
+
const wanted = target.trim();
|
|
22
|
+
if (!(0, image_reference_1.isReference)(wanted)) {
|
|
23
|
+
return {
|
|
24
|
+
ok: false,
|
|
25
|
+
problem: (0, i18n_1.t)({
|
|
26
|
+
en: 'An image name is in lowercase, like my-app or registry.example.com/team/app, optionally followed by :tag.',
|
|
27
|
+
nl: 'Een imagenaam is in kleine letters, zoals mijn-app of registry.example.com/team/app, eventueel gevolgd door :tag.',
|
|
28
|
+
de: 'Ein Image-Name ist kleingeschrieben, etwa mein-app oder registry.example.com/team/app, optional gefolgt von :tag.',
|
|
29
|
+
fr: 'Un nom d’image est en minuscules, comme mon-app ou registry.example.com/equipe/app, suivi éventuellement de :tag.',
|
|
30
|
+
es: 'Un nombre de imagen va en minúsculas, como mi-app o registry.example.com/equipo/app, seguido opcionalmente de :tag.',
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const { repository, tag } = (0, image_reference_1.splitReference)(wanted);
|
|
35
|
+
try {
|
|
36
|
+
await (0, docker_client_1.getConnection)().docker.getImage(source).tag({ repo: repository, tag });
|
|
37
|
+
return { ok: true };
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return { ok: false, problem: (0, docker_client_1.readableError)(err, (0, docker_client_1.getConnection)().endpoint).message };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Haalt één tag weg zonder de image weg te gooien. Dat kan zolang er nog een andere tag aan
|
|
45
|
+
* hangt, of een container: dan blijft de image staan, zonder naam. Bij de laatste tag van een
|
|
46
|
+
* image die niemand gebruikt, is weghalen hetzelfde als verwijderen, en dat is een andere knop.
|
|
47
|
+
*/
|
|
48
|
+
async function untagImage(reference) {
|
|
49
|
+
const { docker } = (0, docker_client_1.getConnection)();
|
|
50
|
+
try {
|
|
51
|
+
const image = (await docker.getImage(reference).inspect());
|
|
52
|
+
const others = (image.RepoTags ?? []).filter((tag) => tag !== reference);
|
|
53
|
+
if (others.length > 0) {
|
|
54
|
+
// Met een andere tag erbij haalt Docker alleen deze naam weg.
|
|
55
|
+
await docker.getImage(reference).remove({ noprune: true });
|
|
56
|
+
return { ok: true };
|
|
57
|
+
}
|
|
58
|
+
const containers = await docker.listContainers({ all: true });
|
|
59
|
+
const used = containers.some((container) => container.ImageID === image.Id);
|
|
60
|
+
if (!used) {
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
problem: (0, i18n_1.t)({
|
|
64
|
+
en: `${reference} is the only name of this image, and no container uses it: removing the tag would remove the image. Use Remove for that.`,
|
|
65
|
+
nl: `${reference} is de enige naam van deze image, en geen container gebruikt hem: de tag weghalen zou de image weggooien. Daar is Verwijderen voor.`,
|
|
66
|
+
de: `${reference} ist der einzige Name dieses Images, und kein Container nutzt es: Das Tag zu entfernen würde das Image löschen. Dafür gibt es Entfernen.`,
|
|
67
|
+
fr: `${reference} est le seul nom de cette image, et aucun conteneur ne l’utilise : retirer le tag supprimerait l’image. Utilisez Supprimer pour cela.`,
|
|
68
|
+
es: `${reference} es el único nombre de esta imagen y ningún contenedor la usa: quitar la etiqueta borraría la imagen. Para eso está Eliminar.`,
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Een image in gebruik gooit Docker nooit weg; met force haalt hij alleen de naam eraf.
|
|
73
|
+
await docker.getImage(reference).remove({ force: true, noprune: true });
|
|
74
|
+
return { ok: true };
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
return { ok: false, problem: (0, docker_client_1.readableError)(err, (0, docker_client_1.getConnection)().endpoint).message };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Een fout bij het pushen in woorden die zeggen wat je kunt doen. */
|
|
81
|
+
function describePushProblem(raw, reference, authenticated) {
|
|
82
|
+
const text = raw.toLowerCase();
|
|
83
|
+
if (text.includes('no such host') || text.includes('dial tcp') || text.includes('enotfound') || text.includes('connection refused')) {
|
|
84
|
+
return (0, i18n_1.t)({
|
|
85
|
+
en: `The registry cannot be reached from this machine. Check your network connection, and whether the registry is running. (${reference})`,
|
|
86
|
+
nl: `De registry is niet bereikbaar vanaf deze machine. Controleer je netwerkverbinding, en of de registry draait. (${reference})`,
|
|
87
|
+
de: `Die Registry ist von diesem Rechner aus nicht erreichbar. Prüfen Sie die Netzwerkverbindung, und ob die Registry läuft. (${reference})`,
|
|
88
|
+
fr: `Le registry est injoignable depuis cette machine. Vérifiez votre connexion réseau, et que le registry fonctionne. (${reference})`,
|
|
89
|
+
es: `No se puede contactar con el registry desde esta máquina. Comprueba la conexión de red, y si el registry está en marcha. (${reference})`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (text.includes('unauthorized') || text.includes('authentication required') || text.includes('denied')) {
|
|
93
|
+
const login = (0, pull_1.loginCommand)(reference);
|
|
94
|
+
return authenticated
|
|
95
|
+
? (0, i18n_1.t)({
|
|
96
|
+
en: `The registry refused the push of '${reference}'. Does this account have write access to this repository? Otherwise log in again with '${login}'.`,
|
|
97
|
+
nl: `De registry weigerde de push van '${reference}'. Mag dit account naar deze repository schrijven? Log anders opnieuw in met '${login}'.`,
|
|
98
|
+
de: `Die Registry hat den Push von '${reference}' abgelehnt. Darf dieses Konto in dieses Repository schreiben? Sonst melden Sie sich erneut mit '${login}' an.`,
|
|
99
|
+
fr: `Le registry a refusé le push de '${reference}'. Ce compte peut-il écrire dans ce dépôt ? Sinon reconnectez-vous avec '${login}'.`,
|
|
100
|
+
es: `El registry ha rechazado el push de '${reference}'. ¿Puede esta cuenta escribir en este repositorio? Si no, vuelve a iniciar sesión con '${login}'.`,
|
|
101
|
+
})
|
|
102
|
+
: (0, i18n_1.t)({
|
|
103
|
+
en: `No access to push '${reference}'. Log in first with '${login}'; the app then uses those credentials automatically.`,
|
|
104
|
+
nl: `Geen toegang om '${reference}' te pushen. Log eerst in met '${login}'; de app gebruikt die inloggegevens daarna vanzelf.`,
|
|
105
|
+
de: `Kein Zugriff, um '${reference}' zu pushen. Melden Sie sich zuerst mit '${login}' an; die App benutzt diese Anmeldedaten danach von selbst.`,
|
|
106
|
+
fr: `Aucun accès pour pousser '${reference}'. Connectez-vous d’abord avec '${login}' ; l’application utilisera ensuite ces identifiants toute seule.`,
|
|
107
|
+
es: `Sin acceso para hacer push de '${reference}'. Inicia sesión primero con '${login}'; después la aplicación usa esas credenciales por su cuenta.`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return (0, i18n_1.t)({
|
|
111
|
+
en: `Pushing '${reference}' failed: ${raw}`,
|
|
112
|
+
nl: `Pushen van '${reference}' mislukte: ${raw}`,
|
|
113
|
+
de: `Der Push von '${reference}' ist fehlgeschlagen: ${raw}`,
|
|
114
|
+
fr: `Le push de '${reference}' a échoué : ${raw}`,
|
|
115
|
+
es: `El push de '${reference}' ha fallado: ${raw}`,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async function openViaDocker(reference, auth) {
|
|
119
|
+
// De daemon wil bij een push altijd een X-Registry-Auth-header, ook zonder inlog: dan een lege.
|
|
120
|
+
return (await (0, docker_client_1.getConnection)().docker.getImage(reference).push({ authconfig: auth ?? {} }));
|
|
121
|
+
}
|
|
122
|
+
/** Pusht een image en meldt de voortgang, per laag, in dezelfde vorm als een pull. */
|
|
123
|
+
async function openPushStream(reference, onProgress, open = openViaDocker, lookup = registry_auth_1.credentialsFor) {
|
|
124
|
+
const auth = await lookup(reference);
|
|
125
|
+
let stream;
|
|
126
|
+
try {
|
|
127
|
+
stream = await open(reference, auth);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return { ok: false, problem: describePushProblem(err instanceof Error ? err.message : String(err), reference, auth !== null) };
|
|
131
|
+
}
|
|
132
|
+
const tracker = (0, pull_1.createPullTracker)(reference, {
|
|
133
|
+
message: (0, i18n_1.t)({ en: `Pushing ${reference}…`, nl: `Bezig met pushen van ${reference}…`, de: `${reference} wird gepusht…`, fr: `Push de ${reference}…`, es: `Haciendo push de ${reference}…` }),
|
|
134
|
+
describe: (error) => describePushProblem(error, reference, auth !== null),
|
|
135
|
+
});
|
|
136
|
+
return { ok: true, stream: (0, pull_1.trackStream)(stream, tracker, onProgress) };
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=image-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-tags.js","sourceRoot":"","sources":["../electron/image-tags.ts"],"names":[],"mappings":"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"}
|
package/dist-electron/images.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.splitReference = splitReference;
|
|
4
3
|
exports.toImageRows = toImageRows;
|
|
5
4
|
exports.countUsage = countUsage;
|
|
6
5
|
exports.listImages = listImages;
|
|
@@ -8,23 +7,9 @@ exports.removeImage = removeImage;
|
|
|
8
7
|
exports.pruneImages = pruneImages;
|
|
9
8
|
const docker_client_1 = require("./docker-client");
|
|
10
9
|
const i18n_1 = require("./i18n");
|
|
10
|
+
const image_reference_1 = require("./image-reference");
|
|
11
11
|
const UNTAGGED = '<none>:<none>';
|
|
12
12
|
const NONE = '<none>';
|
|
13
|
-
/**
|
|
14
|
-
* Splitst een referentie in repository en tag.
|
|
15
|
-
*
|
|
16
|
-
* Op de laatste dubbele punt ná de laatste slash, want een registry mag een poort hebben:
|
|
17
|
-
* in `localhost:5000/app:1.0` hoort `:5000` bij de host en `:1.0` is de tag. Splitsen op de
|
|
18
|
-
* eerste of op elke dubbele punt gaat daar mis.
|
|
19
|
-
*/
|
|
20
|
-
function splitReference(reference) {
|
|
21
|
-
const slash = reference.lastIndexOf('/');
|
|
22
|
-
const colon = reference.lastIndexOf(':');
|
|
23
|
-
if (colon > slash) {
|
|
24
|
-
return { repository: reference.slice(0, colon), tag: reference.slice(colon + 1) };
|
|
25
|
-
}
|
|
26
|
-
return { repository: reference, tag: 'latest' };
|
|
27
|
-
}
|
|
28
13
|
function shortIdOf(id) {
|
|
29
14
|
return id.replace(/^sha256:/, '').slice(0, 12);
|
|
30
15
|
}
|
|
@@ -49,7 +34,7 @@ function toImageRows(raw, usage) {
|
|
|
49
34
|
// Een image zonder tag verwijder je op zijn id; die vult daarom het referentieveld.
|
|
50
35
|
return [{ ...base, repository: NONE, tag: NONE, reference: raw.Id, dangling: true }];
|
|
51
36
|
}
|
|
52
|
-
return tags.map((tag) => ({ ...base, ...splitReference(tag), reference: tag, dangling: false }));
|
|
37
|
+
return tags.map((tag) => ({ ...base, ...(0, image_reference_1.splitReference)(tag), reference: tag, dangling: false }));
|
|
53
38
|
}
|
|
54
39
|
/** Telt per image-id hoeveel containers eraan hangen, draaiend of niet. */
|
|
55
40
|
function countUsage(containers) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"images.js","sourceRoot":"","sources":["../electron/images.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../electron/images.ts"],"names":[],"mappings":"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"}
|
package/dist-electron/ipc.js
CHANGED
|
@@ -64,6 +64,9 @@ const restart_policy_1 = require("./restart-policy");
|
|
|
64
64
|
const run_command_1 = require("./run-command");
|
|
65
65
|
const memory_limit_1 = require("./memory-limit");
|
|
66
66
|
const cpu_limit_1 = require("./cpu-limit");
|
|
67
|
+
const container_rename_1 = require("./container-rename");
|
|
68
|
+
const container_commit_1 = require("./container-commit");
|
|
69
|
+
const environment_1 = require("./environment");
|
|
67
70
|
const log_export_1 = require("./log-export");
|
|
68
71
|
const exec_1 = require("./exec");
|
|
69
72
|
const host_shell_1 = require("./host-shell");
|
|
@@ -86,10 +89,12 @@ const images_1 = require("./images");
|
|
|
86
89
|
const logs_1 = require("./logs");
|
|
87
90
|
const networks_1 = require("./networks");
|
|
88
91
|
const pull_1 = require("./pull");
|
|
92
|
+
const image_tags_1 = require("./image-tags");
|
|
89
93
|
const renew_1 = require("./renew");
|
|
90
94
|
const project_update_1 = require("./project-update");
|
|
91
95
|
const compose_drift_1 = require("./compose-drift");
|
|
92
96
|
const image_file_1 = require("./image-file");
|
|
97
|
+
const volume_copy_1 = require("./volume-copy");
|
|
93
98
|
const service_build_1 = require("./service-build");
|
|
94
99
|
const run_1 = require("./run");
|
|
95
100
|
const volumes_1 = require("./volumes");
|
|
@@ -136,6 +141,7 @@ const settingsPatch = zod_1.z
|
|
|
136
141
|
notifyWiring: zod_1.z.boolean().optional(),
|
|
137
142
|
paletteShortcut: zod_1.z.boolean().optional(),
|
|
138
143
|
autoUpdate: zod_1.z.boolean().optional(),
|
|
144
|
+
autoPrune: zod_1.z.boolean().optional(),
|
|
139
145
|
language: zod_1.z.enum(i18n_1.LANGUAGES).optional(),
|
|
140
146
|
assistantModel: zod_1.z.enum(assistant_models_1.ASSISTANT_MODELS).optional(),
|
|
141
147
|
})
|
|
@@ -637,7 +643,10 @@ function registerIpcHandlers() {
|
|
|
637
643
|
handle(channels_1.CHANNELS.containersRunCommand, (_event, id) => (0, run_command_1.readRunCommand)(containerId.parse(id)));
|
|
638
644
|
handle(channels_1.CHANNELS.containersRestartPolicy, (_event, id) => (0, restart_policy_1.readRestartPolicy)(containerId.parse(id)));
|
|
639
645
|
handle(channels_1.CHANNELS.containersMemoryLimit, (_event, id) => (0, memory_limit_1.readMemoryLimit)(containerId.parse(id)));
|
|
646
|
+
handle(channels_1.CHANNELS.containersRename, (_event, id, name) => (0, container_rename_1.renameContainer)(containerId.parse(id), resourceName.parse(name)));
|
|
647
|
+
handle(channels_1.CHANNELS.containersCommit, (_event, id, reference) => (0, container_commit_1.commitContainer)(containerId.parse(id), imageReference.parse(reference)));
|
|
640
648
|
handle(channels_1.CHANNELS.containersCpuLimit, (_event, id) => (0, cpu_limit_1.readCpuLimit)(containerId.parse(id)));
|
|
649
|
+
handle(channels_1.CHANNELS.containersEnvironment, (_event, id) => (0, environment_1.readEnvironment)(containerId.parse(id)));
|
|
641
650
|
handle(channels_1.CHANNELS.containersSetCpuLimit, (_event, id, cpus) => (0, cpu_limit_1.applyCpuLimit)(containerId.parse(id), cpuCount.parse(cpus)));
|
|
642
651
|
handle(channels_1.CHANNELS.containersSetMemoryLimit, (_event, id, bytes) => (0, memory_limit_1.applyMemoryLimit)(containerId.parse(id), memoryBytes.parse(bytes)));
|
|
643
652
|
handle(channels_1.CHANNELS.containersSaveLogs, (event, id, name) => (0, log_export_1.exportLogs)(containerId.parse(id), resourceName.parse(name), async (suggestedName) => {
|
|
@@ -678,6 +687,21 @@ function registerIpcHandlers() {
|
|
|
678
687
|
state.streams.attach(reserved, outcome.stream);
|
|
679
688
|
return { ok: true, streamId: reserved };
|
|
680
689
|
});
|
|
690
|
+
handle(channels_1.CHANNELS.imagesTag, (_event, source, target) => (0, image_tags_1.tagImage)(imageReference.parse(source), imageReference.parse(target)));
|
|
691
|
+
handle(channels_1.CHANNELS.imagesUntag, (_event, reference) => (0, image_tags_1.untagImage)(imageReference.parse(reference)));
|
|
692
|
+
// Zelfde vorm als de pull: een gereserveerd id, voortgang over het kanaal van dat id.
|
|
693
|
+
handle(channels_1.CHANNELS.imagesPush, async (event, reference) => {
|
|
694
|
+
const state = requireState(event.sender.id);
|
|
695
|
+
const reserved = state.streams.reserve('push');
|
|
696
|
+
const channel = `${channels_1.CHANNELS.imagesPullProgress}:${reserved}`;
|
|
697
|
+
const outcome = await (0, image_tags_1.openPushStream)(imageReference.parse(reference), (progress) => state.streams.send(channel, progress));
|
|
698
|
+
if (!outcome.ok) {
|
|
699
|
+
state.streams.close(reserved);
|
|
700
|
+
return { ok: false, problem: outcome.problem };
|
|
701
|
+
}
|
|
702
|
+
state.streams.attach(reserved, outcome.stream);
|
|
703
|
+
return { ok: true, streamId: reserved };
|
|
704
|
+
});
|
|
681
705
|
handle(channels_1.CHANNELS.imagesCheckUpdates, () => (0, updates_1.checkImageUpdates)());
|
|
682
706
|
handle(channels_1.CHANNELS.imagesStale, (_event, reference) => (0, renew_1.listStaleContainers)(imageReference.parse(reference)));
|
|
683
707
|
handle(channels_1.CHANNELS.imagesRenew, (_event, reference) => (0, renew_1.renewContainers)(imageReference.parse(reference)));
|
|
@@ -710,6 +734,8 @@ function registerIpcHandlers() {
|
|
|
710
734
|
const choice = owner === null ? await electron_1.dialog.showOpenDialog(options) : await electron_1.dialog.showOpenDialog(owner, options);
|
|
711
735
|
return (0, image_file_1.loadImage)(choice.canceled ? null : (choice.filePaths[0] ?? null), (progress) => sendIfAlive(event.sender, channels_1.CHANNELS.imagesFileProgress, progress));
|
|
712
736
|
});
|
|
737
|
+
handle(channels_1.CHANNELS.volumesUsers, (_event, name) => (0, volume_copy_1.listVolumeUsers)(resourceName.parse(name)));
|
|
738
|
+
handle(channels_1.CHANNELS.volumesCopy, (_event, source, target) => (0, volume_copy_1.copyVolume)(resourceName.parse(source), resourceName.parse(target)));
|
|
713
739
|
handle(channels_1.CHANNELS.volumesRestore, async (event, name) => {
|
|
714
740
|
const volume = resourceName.parse(name);
|
|
715
741
|
const owner = electron_1.BrowserWindow.fromWebContents(event.sender);
|