Skip to content

Commit

Permalink
feat: support docker v2 only (#4092)
Browse files Browse the repository at this point in the history
Removes support for v1 docker registries.

Closes #3993

BREAKING CHANGE: Docker v1 registries are no longer supported
  • Loading branch information
rarkins committed Jul 15, 2019
1 parent 62c066c commit d046dc4
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 304 deletions.
69 changes: 30 additions & 39 deletions lib/datasource/docker/index.js
@@ -1,4 +1,4 @@
const dockerRegistryClient = require('@renovatebot/docker-registry-client');
const hasha = require('hasha');
const URL = require('url');
const is = require('@sindresorhus/is');
const parseLinkHeader = require('parse-link-header');
Expand Down Expand Up @@ -113,9 +113,13 @@ async function getAuthHeaders(registry, repository) {
}
}

function digestFromManifestStr(str) {
return 'sha256:' + hasha(str, { algorithm: 'sha256' });
}

function extractDigestFromResponse(manifestResponse) {
if (manifestResponse.headers['docker-content-digest'] === undefined) {
return dockerRegistryClient.digestFromManifestStr(manifestResponse.body);
return digestFromManifestStr(manifestResponse.body);
}
return manifestResponse.headers['docker-content-digest'];
}
Expand Down Expand Up @@ -367,44 +371,31 @@ async function getLabels(registry, repository, tag) {
}
const manifest = JSON.parse(manifestResponse.body);
let labels = {};
if (manifest.schemaVersion === 1) {
try {
labels = JSON.parse(manifest.history[0].v1Compatibility)
.container_config.Labels;
} catch (err) {
logger.debug('Could not retrieve labels from v1 manifest');
}
if (!labels) {
labels = {};
}
}
if (manifest.schemaVersion === 2) {
const configDigest = manifest.config.digest;
const headers = await getAuthHeaders(registry, repository);
if (!headers) {
logger.info('No docker auth found - returning');
return {};
}
const url = `${registry}/v2/${repository}/blobs/${configDigest}`;
const configResponse = await got(url, {
headers,
hooks: {
beforeRedirect: [
options => {
if (
options.search &&
options.search.indexOf('X-Amz-Algorithm') !== -1
) {
// docker registry is hosted on amazon, redirect url includes authentication.
// eslint-disable-next-line no-param-reassign
delete options.headers.authorization;
}
},
],
},
});
labels = JSON.parse(configResponse.body).config.Labels;
const configDigest = manifest.config.digest;
const headers = await getAuthHeaders(registry, repository);
if (!headers) {
logger.info('No docker auth found - returning');
return {};
}
const url = `${registry}/v2/${repository}/blobs/${configDigest}`;
const configResponse = await got(url, {
headers,
hooks: {
beforeRedirect: [
options => {
if (
options.search &&
options.search.indexOf('X-Amz-Algorithm') !== -1
) {
// docker registry is hosted on amazon, redirect url includes authentication.
// eslint-disable-next-line no-param-reassign
delete options.headers.authorization;
}
},
],
},
});
labels = JSON.parse(configResponse.body).config.Labels;

if (labels) {
logger.debug(
Expand Down
1 change: 0 additions & 1 deletion package.json
Expand Up @@ -88,7 +88,6 @@
},
"dependencies": {
"@renovate/pep440": "0.4.1",
"@renovatebot/docker-registry-client": "3.3.0",
"@sindresorhus/is": "1.0.0",
"@snyk/ruby-semver": "2.0.3",
"@yarnpkg/lockfile": "1.1.0",
Expand Down
2 changes: 1 addition & 1 deletion test/datasource/docker.spec.js
Expand Up @@ -149,7 +149,7 @@ describe('api/docker', () => {
headers: { 'docker-content-digest': 'some-digest' },
});
const res = await docker.getDigest(
{ lookupName: 'some-dep' },
{ lookupName: 'some-other-dep' },
'8.0.0-alpine'
);
expect(res).toBe('some-digest');
Expand Down

0 comments on commit d046dc4

Please sign in to comment.