diff --git a/lib/manager/docker-compose/index.js b/lib/manager/docker-compose/index.js
index 32df37546d82e75f682617dbdc5fbdbf0570fcf9..293eec585b5704ad4204ebb38dd21aa2ce7577f9 100644
--- a/lib/manager/docker-compose/index.js
+++ b/lib/manager/docker-compose/index.js
@@ -1,16 +1,12 @@
 const { extractDependencies } = require('./extract');
 const { getPackageUpdates } = require('../docker/package');
-const { resolvePackageFile } = require('./resolve');
 const { updateDependency } = require('./update');
 
-const contentPattern = new RegExp('(^|\\n)\\s*image:');
 const language = 'docker';
 
 module.exports = {
-  contentPattern,
   extractDependencies,
   getPackageUpdates,
   language,
-  resolvePackageFile,
   updateDependency,
 };
diff --git a/lib/manager/docker-compose/resolve.js b/lib/manager/docker-compose/resolve.js
deleted file mode 100644
index 04d77824c1fd87dfd5f9e5e6bc36cbf2f184f360..0000000000000000000000000000000000000000
--- a/lib/manager/docker-compose/resolve.js
+++ /dev/null
@@ -1,22 +0,0 @@
-const { mergeChildConfig } = require('../../config');
-
-module.exports = {
-  resolvePackageFile,
-};
-
-async function resolvePackageFile(config, inputFile) {
-  const composeConfig = mergeChildConfig(
-    config.docker,
-    config['docker-compose']
-  );
-  const packageFile = mergeChildConfig(composeConfig, inputFile);
-  logger.debug(
-    `Resolving packageFile ${JSON.stringify(packageFile.packageFile)}`
-  );
-  packageFile.content = await platform.getFile(packageFile.packageFile);
-  if (!packageFile.content) {
-    logger.debug('No packageFile content');
-    return null;
-  }
-  return packageFile;
-}
diff --git a/lib/manager/docker/index.js b/lib/manager/docker/index.js
index eb6283fdc112032ac8d96d94c9f24758327c3449..0e9687649368740ebb4e90c97681b1802ed13fc9 100644
--- a/lib/manager/docker/index.js
+++ b/lib/manager/docker/index.js
@@ -1,14 +1,9 @@
 const { extractDependencies } = require('./extract');
 const { getPackageUpdates } = require('./package');
-const { resolvePackageFile } = require('./resolve');
 const { updateDependency } = require('./update');
 
-const contentPattern = new RegExp('(^|\\n)FROM .+\\n', 'i');
-
 module.exports = {
-  contentPattern,
   extractDependencies,
   getPackageUpdates,
-  resolvePackageFile,
   updateDependency,
 };
diff --git a/lib/manager/docker/resolve.js b/lib/manager/docker/resolve.js
deleted file mode 100644
index 3815d167bd2b55c912f0fab24707be64855a83f9..0000000000000000000000000000000000000000
--- a/lib/manager/docker/resolve.js
+++ /dev/null
@@ -1,29 +0,0 @@
-const configParser = require('../../config');
-
-module.exports = {
-  resolvePackageFile,
-};
-
-async function resolvePackageFile(config, inputFile) {
-  const packageFile = configParser.mergeChildConfig(config.docker, inputFile);
-  logger.debug(
-    `Resolving packageFile ${JSON.stringify(packageFile.packageFile)}`
-  );
-  packageFile.content = await platform.getFile(packageFile.packageFile);
-  if (!packageFile.content) {
-    logger.debug('No packageFile content');
-    return null;
-  }
-  const strippedComment = packageFile.content.replace(/^((#.*?|\s*)\n)+/, '');
-  const fromMatch = strippedComment.match(/^[Ff][Rr][Oo][Mm] (.*)\n/);
-  if (!fromMatch) {
-    logger.debug(
-      { content: packageFile.content, strippedComment },
-      'No FROM found'
-    );
-    return null;
-  }
-  [, packageFile.currentFrom] = fromMatch;
-  logger.debug('Adding Dockerfile');
-  return packageFile;
-}
diff --git a/test/manager/__snapshots__/index.spec.js.snap b/test/manager/__snapshots__/index.spec.js.snap
index 79791a0c18f0bf4ae375940c48d5ab9a6a35cf15..38ee9dcdec0086d82d0910e141cdce5b5f00ed53 100644
--- a/test/manager/__snapshots__/index.spec.js.snap
+++ b/test/manager/__snapshots__/index.spec.js.snap
@@ -41,6 +41,10 @@ Array [
     "manager": "docker",
     "packageFile": "other/Dockerfile",
   },
+  Object {
+    "manager": "docker",
+    "packageFile": "another/Dockerfile",
+  },
 ]
 `;
 
diff --git a/test/manager/__snapshots__/resolve.spec.js.snap b/test/manager/__snapshots__/resolve.spec.js.snap
index b71a0751cd29ce5f63c9613d3b5976b9f479098e..a9694296cc18b4a3eba076a1e2124433f0ce108e 100644
--- a/test/manager/__snapshots__/resolve.spec.js.snap
+++ b/test/manager/__snapshots__/resolve.spec.js.snap
@@ -47,7 +47,49 @@ Array [
 ]
 `;
 
-exports[`manager/resolve resolvePackageFiles() skips if no content or no match 1`] = `Array []`;
+exports[`manager/resolve resolvePackageFiles() skips if no content or no match 1`] = `
+Array [
+  Object {
+    "commitMessageTopic": "{{{depName}}} Docker tag",
+    "content": "# comment
+",
+    "digest": Object {
+      "branchTopic": "{{{depNameSanitized}}}-{{{currentTag}}}",
+      "commitMessageExtra": "to {{newDigestShort}}",
+      "commitMessageTopic": "{{{depName}}}:{{{currentTag}}} Docker digest",
+      "group": Object {
+        "commitMessageTopic": "{{{groupName}}}",
+        "prBody": "This Pull Request updates Dockerfiles to the latest image digests. For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#each upgrades as |upgrade|}}\\n-   {{#if repositoryUrl}}[{{upgrade.depName}}]({{upgrade.repositoryUrl}}){{else}}\`{{{depName}}}\`{{/if}}: \`{{upgrade.newDigest}}\`\\n{{/each}}\\n\\n**Important**: Renovate will wait until you have merged this Pin request before creating PRs for any *upgrades*. If you do not wish to pin anything, please update your config accordingly instead of leaving this PR open.\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n-   \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n-   \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}",
+      },
+      "prBody": "This Pull Request updates Docker base image \`{{{depName}}}:{{{currentTag}}}\` to the latest digest (\`{{{newDigest}}}\`). For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n-   \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n-   \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}",
+    },
+    "fileMatch": Array [
+      "(^|/)Dockerfile$",
+    ],
+    "group": Object {
+      "commitMessageTopic": "{{{groupName}}} Docker tags",
+      "prBody": "This Pull Request updates Dockerfiles to use image digests.\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#each upgrades as |upgrade|}}\\n-   {{#if repositoryUrl}}[{{upgrade.depName}}]({{upgrade.repositoryUrl}}){{else}}\`{{{depName}}}\`{{/if}}: \`{{upgrade.newDigest}}\`\\n{{/each}}\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n-   \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n-   \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}",
+    },
+    "major": Object {
+      "enabled": false,
+    },
+    "manager": "docker",
+    "managerBranchPrefix": "docker-",
+    "packageFile": "Dockerfile",
+    "pin": Object {
+      "commitMessageExtra": "",
+      "group": Object {
+        "branchTopic": "digests-pin",
+        "commitMessageTopic": "{{{groupName}}}",
+        "prBody": "This Pull Request pins Dockerfiles to use image digests. For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#each upgrades as |upgrade|}}\\n-   {{#if repositoryUrl}}[{{upgrade.depName}}]({{upgrade.repositoryUrl}}){{else}}\`{{{depName}}}\`{{/if}}: \`{{upgrade.newDigest}}\`\\n{{/each}}\\n\\n**Important**: Renovate will wait until you have merged this Pin request before creating PRs for any *upgrades*. If you do not wish to pin anything, please update your config accordingly instead of leaving this PR open.\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n-   \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n-   \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}",
+      },
+      "groupName": "Docker digests",
+      "prBody": "This Pull Request pins Docker base image \`{{{depName}}}:{{{currentTag}}}\` to use a digest (\`{{{newDigest}}}\`).\\nThis digest will then be kept updated via Pull Requests whenever the image is updated on the Docker registry. For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n**Important**: Renovate will wait until you have merged this Pin request before creating PRs for any *upgrades*. If you do not wish to pin anything, please update your config accordingly instead of leaving this PR open.\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n-   \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n-   \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}",
+    },
+    "prBody": "This Pull Request updates Docker base image \`{{{depName}}}\` from tag \`{{{currentTag}}}\` to new tag \`{{{newTag}}}\`. For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n-   \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n-   \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}",
+  },
+]
+`;
 
 exports[`manager/resolve resolvePackageFiles() strips npmrc with NPM_TOKEN 1`] = `
 Array [
diff --git a/test/manager/index.spec.js b/test/manager/index.spec.js
index df40b3137d02806e4facc8a2472fc85f1c815aaa..f8af1dcc1d5c1dabab3bc56a209c27db616988c5 100644
--- a/test/manager/index.spec.js
+++ b/test/manager/index.spec.js
@@ -73,18 +73,9 @@ describe('manager', () => {
         'other/Dockerfile',
         'another/Dockerfile',
       ]);
-      platform.getFile.mockReturnValueOnce(
-        '### comment\n\n \nFROM something\nRUN something\nFROM something-else\nRUN bar'
-      );
-      platform.getFile.mockReturnValueOnce(
-        'ARG foo\nFROM something\nRUN something'
-      );
-      platform.getFile.mockReturnValueOnce(
-        'ARG foo\nno FROM at all\nRUN something'
-      );
       const res = await manager.detectPackageFiles(config);
       expect(res).toMatchSnapshot();
-      expect(res).toHaveLength(2);
+      expect(res).toHaveLength(3);
     });
     it('finds .travis.yml files', async () => {
       config.travis.enabled = true;
@@ -123,12 +114,6 @@ describe('manager', () => {
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(2);
     });
-    it('skips Dockerfiles with no content', async () => {
-      platform.getFileList.mockReturnValueOnce(['Dockerfile']);
-      platform.getFile.mockReturnValueOnce(null);
-      const res = await manager.detectPackageFiles(config);
-      expect(res).toHaveLength(0);
-    });
     it('ignores node modules', async () => {
       platform.getFileList.mockReturnValueOnce([
         'package.json',