docker: parseImageRef

This commit is contained in:
Girish Ramakrishnan
2024-12-14 14:00:05 +01:00
parent d456f91921
commit 5ce82d6794
4 changed files with 35 additions and 19 deletions
+15 -7
View File
@@ -26,7 +26,7 @@ exports = module.exports = {
update,
parseImageName,
parseImageRef,
createExec,
startExec,
@@ -47,7 +47,6 @@ const apps = require('./apps.js'),
promiseRetry = require('./promise-retry.js'),
services = require('./services.js'),
settings = require('./settings.js'),
semver = require('semver'),
shell = require('./shell.js')('docker'),
safe = require('safetydance'),
timers = require('timers/promises'),
@@ -682,10 +681,19 @@ async function setRegistryConfig(registryConfig) {
await settings.setJson(settings.REGISTRY_CONFIG_KEY, registryConfig);
}
function parseImageName(imageName) {
const repository = imageName.split(':', 1)[0];
const tag = imageName.substr(repository.length + 1).split('@', 1)[0];
const digest = imageName.substr(repository.length + 1 + tag.length + 1).split(':', 2)[1];
function parseImageRef(ref) {
// a ref is like registry.docker.com/cloudron/base:4.2.0@sha256:46da2fffb36353ef714f97ae8e962bd2c212ca091108d768ba473078319a47f4
// registry.docker.com is registry name . cloudron is namespace . base is image name . cloudron/base is repository path
// registry.docker.com/cloudron/base is fullRepositoryName
const result = { fullRepositoryName: null, tag: null, digest: null };
result.fullRepositoryName = ref.split(/[:@]/)[0];
let remaining = ref.substr(result.fullRepositoryName.length);
if (remaining.startsWith(':')) {
result.tag = remaining.substr(1).split('@', 1)[0];
remaining = remaining.substr(result.tag.length + 1); // also ':'
}
return { repository, tag, version: semver.parse(tag), digest };
if (remaining.startsWith('@sha256:')) result.digest = remaining.substr(8);
return result;
}