diff --git a/lib/datasource/docker/index.ts b/lib/datasource/docker/index.ts
index d8d9e22fbfcac62985268677ffd2ce1963cc81d8..9af8dec5203cd807df27ac2f903d8ee535fe23f6 100644
--- a/lib/datasource/docker/index.ts
+++ b/lib/datasource/docker/index.ts
@@ -43,6 +43,8 @@ export const defaultConfig = {
   group: {
     commitMessageTopic: '{{{groupName}}} Docker tags',
   },
+  autoReplaceStringTemplate:
+    '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
 };
 
 const http = new Http(id);
diff --git a/lib/manager/ansible/__snapshots__/extract.spec.ts.snap b/lib/manager/ansible/__snapshots__/extract.spec.ts.snap
index debebba8a84c5b1f380f42228b7dec5c3980c827..9de39fc4c968c62a696de4291c76ecb14d349c37 100644
--- a/lib/manager/ansible/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/ansible/__snapshots__/extract.spec.ts.snap
@@ -7,9 +7,7 @@ Array [
     "currentValue": undefined,
     "datasource": "docker",
     "depName": "busybox",
-    "managerData": Object {
-      "lineNumber": 4,
-    },
+    "replaceString": "busybox",
     "versioning": "docker",
   },
   Object {
@@ -17,9 +15,7 @@ Array [
     "currentValue": undefined,
     "datasource": "docker",
     "depName": "redis",
-    "managerData": Object {
-      "lineNumber": 11,
-    },
+    "replaceString": "redis",
     "versioning": "docker",
   },
   Object {
@@ -27,9 +23,7 @@ Array [
     "currentValue": undefined,
     "datasource": "docker",
     "depName": "someuser/appimage",
-    "managerData": Object {
-      "lineNumber": 23,
-    },
+    "replaceString": "someuser/appimage",
     "versioning": "docker",
   },
   Object {
@@ -37,9 +31,7 @@ Array [
     "currentValue": "14.04",
     "datasource": "docker",
     "depName": "ubuntu",
-    "managerData": Object {
-      "lineNumber": 40,
-    },
+    "replaceString": "ubuntu:14.04",
     "versioning": "docker",
   },
   Object {
@@ -47,9 +39,7 @@ Array [
     "currentValue": undefined,
     "datasource": "docker",
     "depName": "someuser/anotherappimage",
-    "managerData": Object {
-      "lineNumber": 52,
-    },
+    "replaceString": "someuser/anotherappimage",
     "versioning": "docker",
   },
   Object {
@@ -57,9 +47,7 @@ Array [
     "currentValue": undefined,
     "datasource": "docker",
     "depName": "busybox",
-    "managerData": Object {
-      "lineNumber": 64,
-    },
+    "replaceString": "busybox",
     "versioning": "docker",
   },
   Object {
@@ -67,9 +55,7 @@ Array [
     "currentValue": "latest",
     "datasource": "docker",
     "depName": "postgres",
-    "managerData": Object {
-      "lineNumber": 76,
-    },
+    "replaceString": "postgres:latest",
     "versioning": "docker",
   },
   Object {
@@ -77,9 +63,7 @@ Array [
     "currentValue": "14.04",
     "datasource": "docker",
     "depName": "ubuntu",
-    "managerData": Object {
-      "lineNumber": 83,
-    },
+    "replaceString": "ubuntu:14.04",
     "versioning": "docker",
   },
   Object {
@@ -87,9 +71,7 @@ Array [
     "currentValue": "14.04",
     "datasource": "docker",
     "depName": "ubuntu",
-    "managerData": Object {
-      "lineNumber": 96,
-    },
+    "replaceString": "ubuntu:14.04",
     "versioning": "docker",
   },
 ]
@@ -102,9 +84,7 @@ Array [
     "currentValue": "11.5.1",
     "datasource": "docker",
     "depName": "sameersbn/gitlab",
-    "managerData": Object {
-      "lineNumber": 8,
-    },
+    "replaceString": "sameersbn/gitlab:11.5.1",
     "versioning": "docker",
   },
   Object {
@@ -112,9 +92,7 @@ Array [
     "currentValue": "10",
     "datasource": "docker",
     "depName": "sameersbn/postgresql",
-    "managerData": Object {
-      "lineNumber": 30,
-    },
+    "replaceString": "sameersbn/postgresql:10",
     "versioning": "docker",
   },
   Object {
@@ -122,9 +100,7 @@ Array [
     "currentValue": "4.0.9-1",
     "datasource": "docker",
     "depName": "sameersbn/redis",
-    "managerData": Object {
-      "lineNumber": 38,
-    },
+    "replaceString": "sameersbn/redis:4.0.9-1",
     "versioning": "docker",
   },
   Object {
@@ -132,9 +108,7 @@ Array [
     "currentValue": "2.6.2",
     "datasource": "docker",
     "depName": "registry",
-    "managerData": Object {
-      "lineNumber": 43,
-    },
+    "replaceString": "registry:2.6.2",
     "versioning": "docker",
   },
 ]
diff --git a/lib/manager/ansible/extract.ts b/lib/manager/ansible/extract.ts
index 48dd675979e0f969228656d8ab04b3596ad6d3b2..5493326a86b59d442c21fb55a3868d4b4fd3f1c9 100644
--- a/lib/manager/ansible/extract.ts
+++ b/lib/manager/ansible/extract.ts
@@ -8,7 +8,6 @@ export default function extractPackageFile(
 ): PackageFile | null {
   logger.trace('ansible.extractPackageFile()');
   let deps: PackageDependency[] = [];
-  let lineNumber = 0;
   const re = /^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/;
   for (const line of content.split('\n')) {
     const match = re.exec(line);
@@ -23,11 +22,9 @@ export default function extractPackageFile(
         },
         'Docker image inside ansible'
       );
-      dep.managerData = { lineNumber };
       dep.versioning = dockerVersioning.id;
       deps.push(dep);
     }
-    lineNumber += 1;
   }
   deps = deps.filter(
     (dep) => !(dep.currentValue && dep.currentValue.includes('${'))
diff --git a/lib/manager/ansible/index.ts b/lib/manager/ansible/index.ts
index d917798c5220a261a46920e8bca081e34c2ce68c..fd10faf714fc1530a6c1e53de6d5e3e71ade5566 100644
--- a/lib/manager/ansible/index.ts
+++ b/lib/manager/ansible/index.ts
@@ -1,10 +1,9 @@
 import extractPackageFile from './extract';
-import updateDependency from './update';
 import { LANGUAGE_DOCKER } from '../../constants/languages';
 
 const language = LANGUAGE_DOCKER;
 
-export { extractPackageFile, language, updateDependency };
+export { extractPackageFile, language };
 
 export const defaultConfig = {
   fileMatch: ['(^|/)tasks/[^/]+\\.ya?ml$'],
diff --git a/lib/manager/ansible/update.spec.ts b/lib/manager/ansible/update.spec.ts
deleted file mode 100644
index 8299bbf6fa1296e307371f2f59894366a1815dbe..0000000000000000000000000000000000000000
--- a/lib/manager/ansible/update.spec.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { readFileSync } from 'fs';
-import updateDependency from './update';
-
-const yamlFile1 = readFileSync(
-  'lib/manager/ansible/__fixtures__/main1.yaml',
-  'utf8'
-);
-const yamlFile2 = readFileSync(
-  'lib/manager/ansible/__fixtures__/main2.yaml',
-  'utf8'
-);
-
-describe('manager/ansible/update', () => {
-  describe('updateDependency', () => {
-    it('replaces existing value from docker_container', () => {
-      const upgrade = {
-        managerData: { lineNumber: 4 },
-        depName: 'busybox',
-        newValue: '1.29.3',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile1, upgrade });
-      expect(res).not.toEqual(yamlFile1);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('replaces existing value from docker_service', () => {
-      const upgrade = {
-        managerData: { lineNumber: 8 },
-        depName: 'sameersbn/gitlab',
-        newValue: '11.5.1',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile2, upgrade });
-      expect(res).not.toEqual(yamlFile2);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('returns same', () => {
-      const upgrade = {
-        managerData: { lineNumber: 38 },
-        depName: 'sameersbn/redis',
-        newValue: '4.0.9-1',
-      };
-      const res = updateDependency({ fileContent: yamlFile2, upgrade });
-      expect(res).toEqual(yamlFile2);
-    });
-    it('returns null if mismatch', () => {
-      const upgrade = {
-        managerData: { lineNumber: 52 },
-        newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile2, upgrade });
-      expect(res).toBeNull();
-    });
-    it('returns null if error', () => {
-      const res = updateDependency({ fileContent: null, upgrade: null });
-      expect(res).toBeNull();
-    });
-  });
-});
diff --git a/lib/manager/ansible/update.ts b/lib/manager/ansible/update.ts
deleted file mode 100644
index bccacff450f234c35eb6eaccad0ea0aeef78ad58..0000000000000000000000000000000000000000
--- a/lib/manager/ansible/update.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { logger } from '../../logger';
-import { getNewFrom } from '../dockerfile/update';
-import { UpdateDependencyConfig } from '../common';
-import { regEx } from '../../util/regex';
-
-export default function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  try {
-    const newFrom = getNewFrom(upgrade);
-    logger.debug(`ansible.updateDependency(): ${newFrom}`);
-    const lines = fileContent.split('\n');
-    const lineToChange = lines[upgrade.managerData.lineNumber];
-    const imageLine = regEx(`^(\\s*image:\\s*'?"?)[^\\s'"]+('?"?\\s*)$`);
-    if (!imageLine.test(lineToChange)) {
-      logger.debug('No image line found');
-      return null;
-    }
-    const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`);
-    if (newLine === lineToChange) {
-      logger.debug('No changes necessary');
-      return fileContent;
-    }
-    lines[upgrade.managerData.lineNumber] = newLine;
-    return lines.join('\n');
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new Dockerfile value');
-    return null;
-  }
-}
diff --git a/lib/manager/circleci/__snapshots__/extract.spec.ts.snap b/lib/manager/circleci/__snapshots__/extract.spec.ts.snap
index 825af9c96d4ea318b456dd91c65410ee09a9a350..c1658309131572c3950456d5f2cdf9dd11d7890c 100644
--- a/lib/manager/circleci/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/circleci/__snapshots__/extract.spec.ts.snap
@@ -9,9 +9,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 12,
-    },
+    "replaceString": "node",
     "versioning": "docker",
   },
   Object {
@@ -21,9 +19,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 57,
-    },
+    "replaceString": "node:4",
     "versioning": "docker",
   },
   Object {
@@ -33,9 +29,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 61,
-    },
+    "replaceString": "node:6",
     "versioning": "docker",
   },
   Object {
@@ -45,9 +39,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 65,
-    },
+    "replaceString": "node:8.9.0",
     "versioning": "docker",
   },
 ]
@@ -62,9 +54,6 @@ Array [
     "depName": "release-workflows",
     "depType": "orb",
     "lookupName": "hutson/library-release-workflows",
-    "managerData": Object {
-      "lineNumber": 3,
-    },
     "rangeStrategy": "pin",
     "versioning": "npm",
   },
@@ -75,9 +64,6 @@ Array [
     "depName": "no-version",
     "depType": "orb",
     "lookupName": "abc/def",
-    "managerData": Object {
-      "lineNumber": 4,
-    },
     "rangeStrategy": "pin",
     "versioning": "npm",
   },
@@ -88,9 +74,6 @@ Array [
     "depName": "volatile",
     "depType": "orb",
     "lookupName": "zzz/zzz",
-    "managerData": Object {
-      "lineNumber": 5,
-    },
     "rangeStrategy": "pin",
     "versioning": "npm",
   },
@@ -100,9 +83,7 @@ Array [
     "datasource": "docker",
     "depName": "python",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 20,
-    },
+    "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077",
     "versioning": "docker",
   },
   Object {
@@ -111,9 +92,7 @@ Array [
     "datasource": "docker",
     "depName": "python",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 27,
-    },
+    "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077",
     "versioning": "docker",
   },
   Object {
@@ -122,9 +101,7 @@ Array [
     "datasource": "docker",
     "depName": "python",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 34,
-    },
+    "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077",
     "versioning": "docker",
   },
   Object {
@@ -133,9 +110,7 @@ Array [
     "datasource": "docker",
     "depName": "python",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 41,
-    },
+    "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077",
     "versioning": "docker",
   },
   Object {
@@ -144,9 +119,7 @@ Array [
     "datasource": "docker",
     "depName": "pypy",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 50,
-    },
+    "replaceString": "pypy:3-6@sha256:eb6325b75c1c70b4992eaa1bdd29e24e5f14d5324b4714a49f3e67783473214b",
     "versioning": "docker",
   },
   Object {
@@ -155,9 +128,7 @@ Array [
     "datasource": "docker",
     "depName": "python",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 57,
-    },
+    "replaceString": "python:3.7@sha256:3870d35b962a943df72d948580fc66ceaaee1c4fbd205930f32e0f0760eb1077",
     "versioning": "docker",
   },
 ]
diff --git a/lib/manager/circleci/extract.ts b/lib/manager/circleci/extract.ts
index 71a0bbd1ab6339bcec52bd0f0320fb8a17533df8..feb890bf68d0471c35d7dedfbe9ea37daad885ca 100644
--- a/lib/manager/circleci/extract.ts
+++ b/lib/manager/circleci/extract.ts
@@ -29,7 +29,6 @@ export function extractPackageFile(content: string): PackageFile | null {
               depType: 'orb',
               depName,
               currentValue,
-              managerData: { lineNumber },
               datasource: datasourceOrb.id,
               lookupName: orbName,
               commitMessageTopic: '{{{depName}}} orb',
@@ -54,7 +53,6 @@ export function extractPackageFile(content: string): PackageFile | null {
         );
         dep.depType = 'docker';
         dep.versioning = 'docker';
-        dep.managerData = { lineNumber };
         deps.push(dep);
       }
     }
diff --git a/lib/manager/circleci/index.ts b/lib/manager/circleci/index.ts
index 5695fc3a5323f09437e16e6070de90b43fe1640f..afef6591c1f8ad89291b6c1423f0b831d8c9ce06 100644
--- a/lib/manager/circleci/index.ts
+++ b/lib/manager/circleci/index.ts
@@ -1,7 +1,6 @@
 import { extractPackageFile } from './extract';
-import { updateDependency } from './update';
 
-export { extractPackageFile, updateDependency };
+export { extractPackageFile };
 
 export const defaultConfig = {
   fileMatch: ['(^|/).circleci/config.yml$'],
diff --git a/lib/manager/circleci/update.spec.ts b/lib/manager/circleci/update.spec.ts
deleted file mode 100644
index 53fec3cc4cddda21a570c66f763f6cc0a1163533..0000000000000000000000000000000000000000
--- a/lib/manager/circleci/update.spec.ts
+++ /dev/null
@@ -1,120 +0,0 @@
-import { readFileSync } from 'fs';
-import * as dcUpdate from './update';
-
-const yamlFile = readFileSync(
-  'lib/manager/circleci/__fixtures__/config.yml',
-  'utf8'
-);
-const yamlFile2 = readFileSync(
-  'lib/manager/circleci/__fixtures__/config2.yml',
-  'utf8'
-);
-
-describe('manager/circleci/update', () => {
-  describe('updateDependency', () => {
-    it('replaces existing value', () => {
-      const upgrade = {
-        managerData: { lineNumber: 65 },
-        depType: 'docker',
-        depName: 'node',
-        newValue: '8.10.0',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = dcUpdate.updateDependency({
-        fileContent: yamlFile,
-        upgrade,
-      });
-      expect(res).not.toEqual(yamlFile);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('returns same', () => {
-      const upgrade = {
-        managerData: { lineNumber: 12 },
-        depType: 'docker',
-        depName: 'node',
-      };
-      const res = dcUpdate.updateDependency({
-        fileContent: yamlFile,
-        upgrade,
-      });
-      expect(res).toEqual(yamlFile);
-    });
-    it('returns null if mismatch', () => {
-      const upgrade = {
-        managerData: { lineNumber: 17 },
-        depType: 'docker',
-        depName: 'postgres',
-        newValue: '9.6.8',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = dcUpdate.updateDependency({
-        fileContent: yamlFile,
-        upgrade,
-      });
-      expect(res).toBeNull();
-    });
-    it('returns null if error', () => {
-      const res = dcUpdate.updateDependency({
-        fileContent: null,
-        upgrade: null,
-      });
-      expect(res).toBeNull();
-    });
-    it('replaces orbs', () => {
-      const upgrade = {
-        currentValue: '4.1.0',
-        depName: 'release-workflows',
-        depType: 'orb',
-        managerData: { lineNumber: 3 },
-        newValue: '4.2.0',
-      };
-      const res = dcUpdate.updateDependency({
-        fileContent: yamlFile2,
-        upgrade,
-      });
-      expect(res).not.toEqual(yamlFile2);
-      expect(res.includes(upgrade.newValue)).toBe(true);
-    });
-    it('returns same orb', () => {
-      const upgrade = {
-        currentValue: '4.0.0',
-        depName: 'release-workflows',
-        depType: 'orb',
-        managerData: { lineNumber: 3 },
-        newValue: '4.1.0',
-      };
-      const res = dcUpdate.updateDependency({
-        fileContent: yamlFile2,
-        upgrade,
-      });
-      expect(res).toEqual(yamlFile2);
-    });
-    it('returns null for orb mismatch', () => {
-      const upgrade = {
-        currentValue: '4.1.0',
-        depName: 'release-workflows',
-        depType: 'orb',
-        managerData: { lineNumber: 2 },
-        newValue: '4.2.0',
-      };
-      const res = dcUpdate.updateDependency({
-        fileContent: yamlFile2,
-        upgrade,
-      });
-      expect(res).toBeNull();
-    });
-    it('returns null for unknown depType', () => {
-      const upgrade = {
-        currentValue: '4.1.0',
-        depName: 'release-workflows',
-        managerData: { lineNumber: 3 },
-        newValue: '4.2.0',
-      };
-      const res = dcUpdate.updateDependency({
-        fileContent: yamlFile2,
-        upgrade,
-      });
-      expect(res).toBeNull();
-    });
-  });
-});
diff --git a/lib/manager/circleci/update.ts b/lib/manager/circleci/update.ts
deleted file mode 100644
index 3af78159bb35634a780b18513f62e1b4fd7e87f6..0000000000000000000000000000000000000000
--- a/lib/manager/circleci/update.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { logger } from '../../logger';
-import { getNewFrom } from '../dockerfile/update';
-import { UpdateDependencyConfig } from '../common';
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  try {
-    const lines = fileContent.split('\n');
-    const lineToChange = lines[upgrade.managerData.lineNumber];
-    if (upgrade.depType === 'docker') {
-      const newFrom = getNewFrom(upgrade);
-      logger.debug(`circleci.updateDependency(): ${newFrom}`);
-      const imageLine = new RegExp(/^(\s*- image:\s*'?"?)[^\s'"]+('?"?\s*)$/);
-      if (!imageLine.test(lineToChange)) {
-        logger.debug('No image line found');
-        return null;
-      }
-      const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`);
-      if (newLine === lineToChange) {
-        logger.debug('No changes necessary');
-        return fileContent;
-      }
-      lines[upgrade.managerData.lineNumber] = newLine;
-      return lines.join('\n');
-    }
-    if (upgrade.depType === 'orb') {
-      const orbLine = new RegExp(`^(\\s+${upgrade.depName}:\\s[^@]+@).+$`);
-      if (!orbLine.test(lineToChange)) {
-        logger.debug('No image line found');
-        return null;
-      }
-      const newLine = lineToChange.replace(orbLine, `$1${upgrade.newValue}`);
-      if (newLine === lineToChange) {
-        logger.debug('No changes necessary');
-        return fileContent;
-      }
-      lines[upgrade.managerData.lineNumber] = newLine;
-      return lines.join('\n');
-    }
-    logger.error('Unknown circleci depType');
-    return null;
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new CircleCI image value');
-    return null;
-  }
-}
diff --git a/lib/manager/docker-compose/__snapshots__/extract.spec.ts.snap b/lib/manager/docker-compose/__snapshots__/extract.spec.ts.snap
index 9939d59beaf1254977f2f90fc198751bc80fa40c..dcac42c3917bfe0c3043389f9f8e70eca1231762 100644
--- a/lib/manager/docker-compose/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/docker-compose/__snapshots__/extract.spec.ts.snap
@@ -7,9 +7,7 @@ Array [
     "currentValue": "alpine",
     "datasource": "docker",
     "depName": "quay.io/something/redis",
-    "managerData": Object {
-      "lineNumber": 4,
-    },
+    "replaceString": "quay.io/something/redis:alpine",
   },
   Object {
     "commitMessageTopic": "Node.js",
@@ -17,60 +15,46 @@ Array [
     "currentValue": "10.0.0",
     "datasource": "docker",
     "depName": "node",
-    "managerData": Object {
-      "lineNumber": 18,
-    },
+    "replaceString": "node:10.0.0",
   },
   Object {
     "currentDigest": undefined,
     "currentValue": "9.4.0",
     "datasource": "docker",
     "depName": "postgres",
-    "managerData": Object {
-      "lineNumber": 21,
-    },
+    "replaceString": "postgres:9.4.0",
   },
   Object {
     "currentDigest": undefined,
     "currentValue": "before",
     "datasource": "docker",
     "depName": "dockersamples/examplevotingapp_vote",
-    "managerData": Object {
-      "lineNumber": 31,
-    },
+    "replaceString": "dockersamples/examplevotingapp_vote:before",
   },
   Object {
     "currentDigest": undefined,
     "currentValue": "before",
     "datasource": "docker",
     "depName": "dockersamples/examplevotingapp_result",
-    "managerData": Object {
-      "lineNumber": 46,
-    },
+    "replaceString": "dockersamples/examplevotingapp_result:before",
   },
   Object {
     "currentDigest": undefined,
     "currentValue": undefined,
     "datasource": "docker",
     "depName": "dockersamples/examplevotingapp_worker",
-    "managerData": Object {
-      "lineNumber": 62,
-    },
+    "replaceString": "dockersamples/examplevotingapp_worker",
   },
   Object {
     "currentDigest": undefined,
     "currentValue": "stable",
     "datasource": "docker",
     "depName": "dockersamples/visualizer",
-    "managerData": Object {
-      "lineNumber": 79,
-    },
+    "replaceString": "dockersamples/visualizer:stable",
   },
   Object {
     "datasource": "docker",
-    "managerData": Object {
-      "lineNumber": 90,
-    },
+    "replaceString": "\${IMAGE:-synkodevelopers/edplugins}:\${TAG:-latest}",
     "skipReason": "contains-variable",
   },
 ]
diff --git a/lib/manager/docker-compose/extract.ts b/lib/manager/docker-compose/extract.ts
index 54558acd70f5fcf66f322f623d53cf9c6287bfb7..4f2d0085d6ebe0ad157e6d939877397a451b181c 100644
--- a/lib/manager/docker-compose/extract.ts
+++ b/lib/manager/docker-compose/extract.ts
@@ -74,7 +74,6 @@ export function extractPackageFile(
         if (!lineNumber) {
           return null;
         }
-        dep.managerData = { lineNumber };
         return dep;
       })
       .filter(Boolean);
diff --git a/lib/manager/docker-compose/index.ts b/lib/manager/docker-compose/index.ts
index d669d93c623bffa6e9b80a98f17be963ba569729..79796edc360fedad192f3cb8770d980edeaebfcb 100644
--- a/lib/manager/docker-compose/index.ts
+++ b/lib/manager/docker-compose/index.ts
@@ -1,10 +1,9 @@
 import { extractPackageFile } from './extract';
-import { updateDependency } from './update';
 import { LANGUAGE_DOCKER } from '../../constants/languages';
 
 const language = LANGUAGE_DOCKER;
 
-export { extractPackageFile, language, updateDependency };
+export { extractPackageFile, language };
 
 export const defaultConfig = {
   fileMatch: ['(^|/)docker-compose[^/]*\\.ya?ml$'],
diff --git a/lib/manager/docker-compose/update.spec.ts b/lib/manager/docker-compose/update.spec.ts
deleted file mode 100644
index b1682524cf178475c0358c8737def08795f23379..0000000000000000000000000000000000000000
--- a/lib/manager/docker-compose/update.spec.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { readFileSync } from 'fs';
-import { updateDependency } from './update';
-
-const yamlFile = readFileSync(
-  'lib/manager/docker-compose/__fixtures__/docker-compose.1.yml',
-  'utf8'
-);
-
-describe('manager/docker-compose/update', () => {
-  describe('updateDependency', () => {
-    it('replaces existing value', () => {
-      const upgrade = {
-        managerData: { lineNumber: 18 },
-        depName: 'postgres',
-        newValue: '9.6.8',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).not.toEqual(yamlFile);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('returns same', () => {
-      const upgrade = {
-        managerData: { lineNumber: 4 },
-        depName: 'quay.io/something/redis',
-        newValue: 'alpine',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toEqual(yamlFile);
-    });
-    it('returns null if mismatch', () => {
-      const upgrade = {
-        managerData: { lineNumber: 17 },
-        newFrom: 'postgres:9.6.8@sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toBeNull();
-    });
-    it('returns null if error', () => {
-      const res = updateDependency({ fileContent: null, upgrade: null });
-      expect(res).toBeNull();
-    });
-  });
-});
diff --git a/lib/manager/docker-compose/update.ts b/lib/manager/docker-compose/update.ts
deleted file mode 100644
index 1ad3f73e6a3e48600df05e7b0da3848cdedff714..0000000000000000000000000000000000000000
--- a/lib/manager/docker-compose/update.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { logger } from '../../logger';
-import { getNewFrom } from '../dockerfile/update';
-import { UpdateDependencyConfig } from '../common';
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string {
-  try {
-    const newFrom = getNewFrom(upgrade);
-    logger.debug(`docker-compose.updateDependency(): ${newFrom}`);
-    const lines = fileContent.split('\n');
-    const lineToChange = lines[upgrade.managerData.lineNumber];
-    const imageLine = /^(\s*image:\s*'?"?)[^\s'"]+('?"?\s*)/;
-    if (!imageLine.test(lineToChange)) {
-      logger.debug('No image line found');
-      return null;
-    }
-    const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`);
-    if (newLine === lineToChange) {
-      logger.debug('No changes necessary');
-      return fileContent;
-    }
-    lines[upgrade.managerData.lineNumber] = newLine;
-    return lines.join('\n');
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new Dockerfile value');
-    return null;
-  }
-}
diff --git a/lib/manager/dockerfile/__snapshots__/extract.spec.ts.snap b/lib/manager/dockerfile/__snapshots__/extract.spec.ts.snap
index 38ba0fa9c41e4783cc5d40df26c9ffc3cb99b35a..4f366f261add16969f60dc206e11c40bebfd03e4 100644
--- a/lib/manager/dockerfile/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/dockerfile/__snapshots__/extract.spec.ts.snap
@@ -9,11 +9,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "stage",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "as skippedfrom",
-      "lineNumber": 0,
-    },
+    "replaceString": "node:8.15.1-alpine",
   },
   Object {
     "currentDigest": undefined,
@@ -21,11 +17,7 @@ Array [
     "datasource": "docker",
     "depName": "golang",
     "depType": "stage",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "as builder",
-      "lineNumber": 1,
-    },
+    "replaceString": "golang:1.7.3",
   },
   Object {
     "currentDigest": undefined,
@@ -33,11 +25,7 @@ Array [
     "datasource": "docker",
     "depName": "alpine",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 9,
-    },
+    "replaceString": "alpine:latest",
   },
 ]
 `;
@@ -51,11 +39,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "stage",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "AS node",
-      "lineNumber": 2,
-    },
+    "replaceString": "node:8.11.3-alpine@sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d",
   },
   Object {
     "currentDigest": undefined,
@@ -63,11 +47,7 @@ Array [
     "datasource": "docker",
     "depName": "buildkite/puppeteer",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "AS puppeteer",
-      "lineNumber": 3,
-    },
+    "replaceString": "buildkite/puppeteer:1.1.1",
   },
 ]
 `;
@@ -81,11 +61,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "stage",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "as frontend",
-      "lineNumber": 0,
-    },
+    "replaceString": "node:6.12.3",
   },
   Object {
     "currentDigest": undefined,
@@ -93,11 +69,7 @@ Array [
     "datasource": "docker",
     "depName": "python",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 4,
-    },
+    "replaceString": "python:3.6-slim",
   },
 ]
 `;
@@ -110,11 +82,7 @@ Array [
     "datasource": "docker",
     "depName": "gcr.io/k8s-skaffold/skaffold",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "COPY --from=",
-      "fromSuffix": "/usr/bin/skaffold /usr/bin/skaffold",
-      "lineNumber": 1,
-    },
+    "replaceString": "gcr.io/k8s-skaffold/skaffold:v0.11.0",
   },
 ]
 `;
@@ -128,11 +96,7 @@ Array [
     "datasource": "docker",
     "depName": "registry.allmine.info:5005/node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "registry.allmine.info:5005/node:8.7.0",
   },
 ]
 `;
@@ -145,11 +109,7 @@ Array [
     "datasource": "docker",
     "depName": "calico/node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "calico/node",
   },
 ]
 `;
@@ -163,11 +123,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 3,
-    },
+    "replaceString": "node",
   },
 ]
 `;
@@ -181,11 +137,7 @@ Array [
     "datasource": "docker",
     "depName": "registry2.something.info/node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "registry2.something.info/node:8",
   },
 ]
 `;
@@ -199,11 +151,7 @@ Array [
     "datasource": "docker",
     "depName": "registry2.something.info/node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "registry2.something.info/node:8-alpine",
   },
 ]
 `;
@@ -217,11 +165,7 @@ Array [
     "datasource": "docker",
     "depName": "registry2.something.info/someaccount/node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "registry2.something.info/someaccount/node:8",
   },
 ]
 `;
@@ -235,11 +179,7 @@ Array [
     "datasource": "docker",
     "depName": "registry2.something.info:5005/node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "registry2.something.info:5005/node:8",
   },
 ]
 `;
@@ -253,11 +193,7 @@ Array [
     "datasource": "docker",
     "depName": "registry2.something.info:5005/node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "registry2.something.info:5005/node",
   },
 ]
 `;
@@ -271,11 +207,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "node@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063",
   },
 ]
 `;
@@ -289,11 +221,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "as base",
-      "lineNumber": 0,
-    },
+    "replaceString": "node:8.9.0-alpine",
   },
 ]
 `;
@@ -307,11 +235,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "node",
   },
 ]
 `;
@@ -325,11 +249,7 @@ Array [
     "datasource": "docker",
     "depName": "mynamespace/node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "mynamespace/node:8",
   },
 ]
 `;
@@ -343,11 +263,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "node:8.9.0-alpine",
   },
 ]
 `;
@@ -361,11 +277,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "node:8.9.0@sha256:eb85fc5b1198f5e1ec025ea07586bdbbf397e7d82df66c90d7511f533517e063",
   },
 ]
 `;
@@ -379,11 +291,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "From",
-      "fromSuffix": "",
-      "lineNumber": 0,
-    },
+    "replaceString": "node",
   },
 ]
 `;
@@ -397,11 +305,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "as frontend",
-      "lineNumber": 0,
-    },
+    "replaceString": "node:6.12.3",
   },
 ]
 `;
@@ -415,11 +319,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "as frontend",
-      "lineNumber": 0,
-    },
+    "replaceString": "node:6.12.3",
   },
 ]
 `;
@@ -433,11 +333,7 @@ Array [
     "datasource": "docker",
     "depName": "node",
     "depType": "final",
-    "managerData": Object {
-      "fromPrefix": "FROM",
-      "fromSuffix": "as frontend",
-      "lineNumber": 0,
-    },
+    "replaceString": "node:6.12.3",
   },
 ]
 `;
diff --git a/lib/manager/dockerfile/__snapshots__/update.spec.ts.snap b/lib/manager/dockerfile/__snapshots__/update.spec.ts.snap
deleted file mode 100644
index d7467353fe5f3b8a5798387b0d2f2478e024e589..0000000000000000000000000000000000000000
--- a/lib/manager/dockerfile/__snapshots__/update.spec.ts.snap
+++ /dev/null
@@ -1,35 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`manager/dockerfile/update updateDependency handles similar FROM 1`] = `
-"FROM debian:wheezy@sha256:abcdefghijklmnop as stage-1
-RUN something
-FROM debian:wheezy@sha256:abcdefghijklmnop
-RUN something else"
-`;
-
-exports[`manager/dockerfile/update updateDependency handles strange whitespace 1`] = `
-"# comment FROM node:8
-FROM node:8@sha256:abcdefghijklmnop as base
-RUN something
-"
-`;
-
-exports[`manager/dockerfile/update updateDependency replaces COPY --from 1`] = `
-"FROM scratch
-COPY --from=gcr.io/k8s-skaffold/skaffold:v0.12.0 /usr/bin/skaffold /usr/bin/skaffold
-"
-`;
-
-exports[`manager/dockerfile/update updateDependency replaces existing value 1`] = `
-"# comment FROM node:8
-FROM node:8.1-alpine@sha256:abcdefghijklmnop
-RUN something
-"
-`;
-
-exports[`manager/dockerfile/update updateDependency replaces existing value with suffix 1`] = `
-"# comment FROM node:8
-FROM node:8@sha256:abcdefghijklmnop as base
-RUN something
-"
-`;
diff --git a/lib/manager/dockerfile/extract.spec.ts b/lib/manager/dockerfile/extract.spec.ts
index d6639f715086b53584ffa82d155b7e07ce5f3a2d..04b3518c7873c3837ca5fb550a471c6b9e17a2a5 100644
--- a/lib/manager/dockerfile/extract.spec.ts
+++ b/lib/manager/dockerfile/extract.spec.ts
@@ -134,8 +134,6 @@ describe('lib/manager/dockerfile/extract', () => {
         res[2].depType === 'final',
         res[1].depType === 'stage',
         res[0].depType === 'stage',
-        res[2].managerData.lineNumber > res[1].managerData.lineNumber,
-        res[2].managerData.lineNumber > res[0].managerData.lineNumber,
       ].every(Boolean);
       expect(passed).toBe(true);
     });
diff --git a/lib/manager/dockerfile/extract.ts b/lib/manager/dockerfile/extract.ts
index d89460e2e322f22f7fccc656495fd81098f55cf1..bff186674358c9c2f15020a7cc7c697a32cc0790 100644
--- a/lib/manager/dockerfile/extract.ts
+++ b/lib/manager/dockerfile/extract.ts
@@ -32,6 +32,7 @@ export function splitImageParts(currentFrom: string): PackageDependency {
 
 export function getDep(currentFrom: string): PackageDependency {
   const dep = splitImageParts(currentFrom);
+  dep.replaceString = currentFrom;
   dep.datasource = datasourceDocker.id;
   if (
     dep.depName &&
@@ -51,12 +52,11 @@ export function extractPackageFile(content: string): PackageFile | null {
     const fromMatch = /^FROM /i.test(fromLine);
     if (fromMatch) {
       logger.trace({ lineNumber, fromLine }, 'FROM line');
-      const [fromPrefix, currentFrom, ...fromRest] = fromLine.match(/\S+/g);
+      const [, currentFrom, ...fromRest] = fromLine.match(/\S+/g);
       if (fromRest.length === 2 && fromRest[0].toLowerCase() === 'as') {
         logger.debug('Found a multistage build stage name');
         stageNames.push(fromRest[1]);
       }
-      const fromSuffix = fromRest.join(' ');
       if (currentFrom === 'scratch') {
         logger.debug('Skipping scratch');
       } else if (stageNames.includes(currentFrom)) {
@@ -71,18 +71,13 @@ export function extractPackageFile(content: string): PackageFile | null {
           },
           'Dockerfile FROM'
         );
-        dep.managerData = {
-          lineNumber,
-          fromPrefix,
-          fromSuffix,
-        };
         deps.push(dep);
       }
     }
 
     const copyFromMatch = /^(COPY --from=)([^\s]+)\s+(.*)$/i.exec(fromLine);
     if (copyFromMatch) {
-      const [, fromPrefix, currentFrom, fromSuffix] = copyFromMatch;
+      const [, , currentFrom] = copyFromMatch;
       logger.trace({ lineNumber, fromLine }, 'COPY --from line');
       if (stageNames.includes(currentFrom)) {
         logger.debug({ currentFrom }, 'Skipping alias COPY --from');
@@ -98,11 +93,6 @@ export function extractPackageFile(content: string): PackageFile | null {
           },
           'Dockerfile COPY --from'
         );
-        dep.managerData = {
-          lineNumber,
-          fromPrefix,
-          fromSuffix,
-        };
         deps.push(dep);
       }
     }
diff --git a/lib/manager/dockerfile/index.ts b/lib/manager/dockerfile/index.ts
index 0fd63ab5d019e16de3d8cb7fdca7f556fce1f98d..92ce98f4a7ed19d36d2fd1002d558e8a9091b2ba 100644
--- a/lib/manager/dockerfile/index.ts
+++ b/lib/manager/dockerfile/index.ts
@@ -1,10 +1,9 @@
 import { extractPackageFile } from './extract';
-import { updateDependency } from './update';
 import { LANGUAGE_DOCKER } from '../../constants/languages';
 
 const language = LANGUAGE_DOCKER;
 
-export { extractPackageFile, language, updateDependency };
+export { extractPackageFile, language };
 
 export const defaultConfig = {
   fileMatch: ['(^|/|\\.)Dockerfile$', '(^|/)Dockerfile\\.[^/]*$'],
diff --git a/lib/manager/dockerfile/update.spec.ts b/lib/manager/dockerfile/update.spec.ts
deleted file mode 100644
index cd4c163abe8631c52b5fc78838eda13785867eb9..0000000000000000000000000000000000000000
--- a/lib/manager/dockerfile/update.spec.ts
+++ /dev/null
@@ -1,134 +0,0 @@
-import * as dockerfile from './update';
-
-describe('manager/dockerfile/update', () => {
-  describe('updateDependency', () => {
-    it('replaces existing value', () => {
-      const fileContent = '# comment FROM node:8\nFROM node:8\nRUN something\n';
-      const upgrade = {
-        managerData: { lineNumber: 1, fromPrefix: 'FROM', fromSuffix: '' },
-        depName: 'node',
-        newValue: '8.1-alpine',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = dockerfile.updateDependency({ fileContent, upgrade });
-      expect(res).toMatchSnapshot();
-    });
-    it('replaces existing value with suffix', () => {
-      const fileContent =
-        '# comment FROM node:8\nFROM node:8 as base\nRUN something\n';
-      const upgrade = {
-        managerData: {
-          lineNumber: 1,
-          fromPrefix: 'FROM',
-          fromSuffix: 'as base',
-        },
-        depName: 'node',
-        newValue: '8',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = dockerfile.updateDependency({ fileContent, upgrade });
-      expect(res).toMatchSnapshot();
-    });
-    it('handles strange whitespace', () => {
-      const fileContent =
-        '# comment FROM node:8\nFROM   node:8 as base\nRUN something\n';
-      const upgrade = {
-        managerData: {
-          lineNumber: 1,
-          fromPrefix: 'FROM',
-          fromSuffix: 'as base',
-        },
-        depName: 'node',
-        newValue: '8',
-
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = dockerfile.updateDependency({ fileContent, upgrade });
-      expect(res).toMatchSnapshot();
-    });
-    it('returns null if mismatch', () => {
-      const fileContent =
-        '# comment FROM node:8\nFROM   node:8 as base\nRUN something\n';
-      const upgrade = {
-        managerData: { lineNumber: 0, fromPrefix: 'FROM', fromSuffix: '' },
-        depName: 'node',
-        newValue: '8',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = dockerfile.updateDependency({ fileContent, upgrade });
-      expect(res).toBeNull();
-    });
-    it('returns unchanged', () => {
-      const fileContent =
-        '# comment FROM node:8\nFROM node:8 as base\nRUN something\n';
-      const upgrade = {
-        managerData: {
-          lineNumber: 1,
-          fromPrefix: 'FROM',
-          fromSuffix: 'as base',
-        },
-        depName: 'node',
-        newValue: '8',
-      };
-      const res = dockerfile.updateDependency({ fileContent, upgrade });
-      expect(res).toBe(fileContent);
-    });
-    it('returns null on error', () => {
-      const fileContent = null;
-      const upgrade = {
-        managerData: { lineNumber: 1, fromPrefix: 'FROM', fromSuffix: '' },
-        depName: 'node',
-        newValue: '8',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = dockerfile.updateDependency({ fileContent, upgrade });
-      expect(res).toBeNull();
-    });
-    it('handles similar FROM', () => {
-      const fileContent =
-        'FROM debian:wheezy as stage-1\nRUN something\nFROM debian:wheezy\nRUN something else';
-      const upgrade1 = {
-        managerData: {
-          lineNumber: 0,
-          fromPrefix: 'FROM',
-          fromSuffix: 'as stage-1',
-        },
-        depName: 'debian',
-        newValue: 'wheezy',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const upgrade2 = {
-        managerData: { lineNumber: 2, fromPrefix: 'FROM', fromSuffix: '' },
-        depName: 'debian',
-        newValue: 'wheezy',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      let res = dockerfile.updateDependency({
-        fileContent,
-        upgrade: upgrade1,
-      });
-      res = dockerfile.updateDependency({
-        fileContent: res,
-        upgrade: upgrade2,
-      });
-      expect(res).toMatchSnapshot();
-      expect(res.includes('as stage-1')).toBe(true);
-    });
-    it('replaces COPY --from', () => {
-      const fileContent =
-        'FROM scratch\nCOPY --from=gcr.io/k8s-skaffold/skaffold:v0.11.0 /usr/bin/skaffold /usr/bin/skaffold\n';
-      const upgrade = {
-        managerData: {
-          lineNumber: 1,
-          fromPrefix: 'COPY --from=',
-          fromSuffix: '/usr/bin/skaffold /usr/bin/skaffold',
-        },
-        depName: 'gcr.io/k8s-skaffold/skaffold',
-        newValue: 'v0.12.0',
-      };
-      const res = dockerfile.updateDependency({ fileContent, upgrade });
-      expect(res).toMatchSnapshot();
-      expect(res.includes(upgrade.newValue)).toBe(true);
-    });
-  });
-});
diff --git a/lib/manager/dockerfile/update.ts b/lib/manager/dockerfile/update.ts
deleted file mode 100644
index bf3c9c260133d0038dc587184ccf8d4a1023374b..0000000000000000000000000000000000000000
--- a/lib/manager/dockerfile/update.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { logger } from '../../logger';
-import { UpdateDependencyConfig, Upgrade } from '../common';
-
-export function getNewFrom(upgrade: Upgrade): string {
-  const { depName, newValue, newDigest } = upgrade;
-  let newFrom = depName;
-  if (newValue) {
-    newFrom += `:${newValue}`;
-  }
-  if (newDigest) {
-    newFrom += `@${newDigest}`;
-  }
-  return newFrom;
-}
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  try {
-    const { lineNumber, fromSuffix } = upgrade.managerData;
-    let { fromPrefix } = upgrade.managerData;
-    const newFrom = getNewFrom(upgrade);
-    logger.debug(`docker.updateDependency(): ${newFrom}`);
-    const lines = fileContent.split('\n');
-    const lineToChange = lines[lineNumber];
-    const imageLine = /^(FROM |COPY --from=)/i;
-    if (!imageLine.test(lineToChange)) {
-      logger.debug('No image line found');
-      return null;
-    }
-    if (!fromPrefix.endsWith('=')) {
-      fromPrefix += ' ';
-    }
-    const newLine = `${fromPrefix}${newFrom} ${fromSuffix}`.trim();
-    if (newLine === lineToChange) {
-      logger.debug('No changes necessary');
-      return fileContent;
-    }
-    lines[lineNumber] = newLine;
-    return lines.join('\n');
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new Dockerfile value');
-    return null;
-  }
-}
diff --git a/lib/manager/droneci/__snapshots__/extract.spec.ts.snap b/lib/manager/droneci/__snapshots__/extract.spec.ts.snap
index cb6449d2a874acaa99b90247ea88eadaca64b3eb..a623bc510585708dfa988045e2e0c1b70e670181 100644
--- a/lib/manager/droneci/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/droneci/__snapshots__/extract.spec.ts.snap
@@ -8,9 +8,7 @@ Array [
     "datasource": "docker",
     "depName": "elixir",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 5,
-    },
+    "replaceString": "elixir:1.8.1-alpine",
   },
   Object {
     "commitMessageTopic": "Node.js",
@@ -19,9 +17,7 @@ Array [
     "datasource": "docker",
     "depName": "amd64/node",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 16,
-    },
+    "replaceString": "amd64/node:10.0.0@sha256:36adc17e9cceab32179d3314da9cb9c737ffb11f0de4e688f407ad6d9ca32201",
   },
   Object {
     "currentDigest": undefined,
@@ -29,9 +25,7 @@ Array [
     "datasource": "docker",
     "depName": "mysql",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 23,
-    },
+    "replaceString": "mysql:5.7.24",
   },
   Object {
     "currentDigest": undefined,
@@ -39,9 +33,7 @@ Array [
     "datasource": "docker",
     "depName": "redis",
     "depType": "docker",
-    "managerData": Object {
-      "lineNumber": 28,
-    },
+    "replaceString": "redis:alpine",
   },
 ]
 `;
diff --git a/lib/manager/droneci/extract.ts b/lib/manager/droneci/extract.ts
index 9c65241b3ecd2089e51195a51f8f0ba6ed85532d..87295ef4725b19428b6295449bf6167e4d96e9d8 100644
--- a/lib/manager/droneci/extract.ts
+++ b/lib/manager/droneci/extract.ts
@@ -21,7 +21,6 @@ export function extractPackageFile(content: string): PackageFile | null {
           'DroneCI docker image'
         );
         dep.depType = 'docker';
-        dep.managerData = { lineNumber };
         deps.push(dep);
       }
     }
diff --git a/lib/manager/droneci/index.ts b/lib/manager/droneci/index.ts
index 1eebd3de018851b4c7de423c9d41d1af06dc8027..de68df83e44f3f336ebda2a6e1c2a949f5885974 100644
--- a/lib/manager/droneci/index.ts
+++ b/lib/manager/droneci/index.ts
@@ -1,10 +1,9 @@
 import { extractPackageFile } from './extract';
-import { updateDependency } from './update';
 import { LANGUAGE_DOCKER } from '../../constants/languages';
 
 const language = LANGUAGE_DOCKER;
 
-export { extractPackageFile, language, updateDependency };
+export { extractPackageFile, language };
 
 export const defaultConfig = {
   fileMatch: ['(^|/).drone.yml$'],
diff --git a/lib/manager/droneci/update.spec.ts b/lib/manager/droneci/update.spec.ts
deleted file mode 100644
index 5947dbbee4a5a818e700ad38dfb58c410797fbae..0000000000000000000000000000000000000000
--- a/lib/manager/droneci/update.spec.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { readFileSync } from 'fs';
-import { resolve } from 'path';
-
-import { updateDependency } from './update';
-
-const droneYAML = readFileSync(
-  resolve('lib/manager/droneci/__fixtures__/.drone.yml'),
-  'utf8'
-);
-
-describe('manager/droneci/update', () => {
-  describe('updateDependency', () => {
-    it('replaces existing value', () => {
-      const upgrade = {
-        managerData: { lineNumber: 16 },
-        depType: 'docker',
-        depName: 'node',
-        newValue: '10.16.0',
-        newDigest: 'sha256:new-node-hash',
-      };
-      const res = updateDependency({ fileContent: droneYAML, upgrade });
-      expect(res).not.toEqual(droneYAML);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-
-    it('returns same', () => {
-      const upgrade = {
-        managerData: { lineNumber: 28 },
-        depType: 'docker',
-        depName: 'redis:alpine',
-      };
-      const res = updateDependency({ fileContent: droneYAML, upgrade });
-      expect(res).toEqual(droneYAML);
-    });
-
-    it('returns null if mismatch', () => {
-      const upgrade = {
-        managerData: { lineNumber: 17 },
-        depType: 'docker',
-        depName: 'postgres',
-        newValue: '9.6.8',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: droneYAML, upgrade });
-      expect(res).toBeNull();
-    });
-
-    it('returns null if error', () => {
-      const res = updateDependency({ fileContent: null, upgrade: null });
-      expect(res).toBeNull();
-    });
-
-    it('returns null for unknown depType', () => {
-      const upgrade = {
-        currentValue: '4.1.0',
-        depName: 'release-workflows',
-        managerData: { lineNumber: 3 },
-        newValue: '4.2.0',
-      };
-      const res = updateDependency({ fileContent: droneYAML, upgrade });
-      expect(res).toBeNull();
-    });
-  });
-});
diff --git a/lib/manager/droneci/update.ts b/lib/manager/droneci/update.ts
deleted file mode 100644
index 920a28770fac03127283495ebd1aa9619c1d25ea..0000000000000000000000000000000000000000
--- a/lib/manager/droneci/update.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { logger } from '../../logger';
-import { getNewFrom } from '../dockerfile/update';
-import { UpdateDependencyConfig } from '../common';
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  try {
-    const lines = fileContent.split('\n');
-    const lineToChange = lines[upgrade.managerData.lineNumber];
-    if (upgrade.depType === 'docker') {
-      const newFrom = getNewFrom(upgrade);
-      logger.debug(`droneci.updateDependency(): ${newFrom}`);
-      const imageLine = /^(\s* image:\s*'?"?)[^\s'"]+('?"?\s*)$/;
-      if (!imageLine.test(lineToChange)) {
-        logger.debug('No image line found');
-        return null;
-      }
-      const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`);
-      if (newLine === lineToChange) {
-        logger.debug('No changes necessary');
-        return fileContent;
-      }
-      lines[upgrade.managerData.lineNumber] = newLine;
-      return lines.join('\n');
-    }
-    logger.error('Unknown DroneCI depType');
-    return null;
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new DroneCI image value');
-    return null;
-  }
-}
diff --git a/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap b/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap
index d4638ac065c5048d34409dfe5edd59df73d6ad66..26f8db34d7b1a78def268e529a90cf3fa132ff7a 100644
--- a/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/github-actions/__snapshots__/extract.spec.ts.snap
@@ -7,9 +7,7 @@ Array [
     "currentValue": undefined,
     "datasource": "docker",
     "depName": "replicated/dockerfilelint",
-    "managerData": Object {
-      "lineNumber": 11,
-    },
+    "replaceString": "replicated/dockerfilelint",
     "versioning": "docker",
   },
   Object {
@@ -18,9 +16,7 @@ Array [
     "currentValue": "6",
     "datasource": "docker",
     "depName": "node",
-    "managerData": Object {
-      "lineNumber": 36,
-    },
+    "replaceString": "node:6@sha256:7b65413af120ec5328077775022c78101f103258a1876ec2f83890bce416e896",
     "versioning": "docker",
   },
 ]
@@ -33,9 +29,7 @@ Array [
     "currentValue": undefined,
     "datasource": "docker",
     "depName": "replicated/dockerfilelint",
-    "managerData": Object {
-      "lineNumber": 17,
-    },
+    "replaceString": "replicated/dockerfilelint",
     "versioning": "docker",
   },
   Object {
@@ -44,9 +38,7 @@ Array [
     "currentValue": "6",
     "datasource": "docker",
     "depName": "node",
-    "managerData": Object {
-      "lineNumber": 31,
-    },
+    "replaceString": "node:6@sha256:7b65413af120ec5328077775022c78101f103258a1876ec2f83890bce416e896",
     "versioning": "docker",
   },
 ]
diff --git a/lib/manager/github-actions/extract.ts b/lib/manager/github-actions/extract.ts
index 15fcc0290f32f447861731e1836891e09d45ee8a..02d3be9b1f8704ddeecdf9c054765146217e4d74 100644
--- a/lib/manager/github-actions/extract.ts
+++ b/lib/manager/github-actions/extract.ts
@@ -6,7 +6,6 @@ import * as dockerVersioning from '../../versioning/docker';
 export function extractPackageFile(content: string): PackageFile | null {
   logger.debug('github-actions.extractPackageFile()');
   const deps: PackageDependency[] = [];
-  let lineNumber = 0;
   for (const line of content.split('\n')) {
     // old github actions syntax will be deprecated on September 30, 2019
     // after that, the first line can be removed
@@ -24,11 +23,9 @@ export function extractPackageFile(content: string): PackageFile | null {
         },
         'Docker image inside GitHub Actions'
       );
-      dep.managerData = { lineNumber };
       dep.versioning = dockerVersioning.id;
       deps.push(dep);
     }
-    lineNumber += 1;
   }
   if (!deps.length) {
     return null;
diff --git a/lib/manager/github-actions/index.ts b/lib/manager/github-actions/index.ts
index a88cc79e19da45a2c8dcf2e47fe22a7b973ee55b..783e09e991c3924695e6d27ce0fab279c49d8fee 100644
--- a/lib/manager/github-actions/index.ts
+++ b/lib/manager/github-actions/index.ts
@@ -1,10 +1,9 @@
 import { extractPackageFile } from './extract';
-import { updateDependency } from './update';
 import { LANGUAGE_DOCKER } from '../../constants/languages';
 
 const language = LANGUAGE_DOCKER;
 
-export { extractPackageFile, language, updateDependency };
+export { extractPackageFile, language };
 
 export const defaultConfig = {
   fileMatch: [
diff --git a/lib/manager/github-actions/update.spec.ts b/lib/manager/github-actions/update.spec.ts
deleted file mode 100644
index 57d66b8034df95ab325e61234b44c3c55920b3e6..0000000000000000000000000000000000000000
--- a/lib/manager/github-actions/update.spec.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { readFileSync } from 'fs';
-import { updateDependency } from './update';
-
-const workflow1 = readFileSync(
-  'lib/manager/github-actions/__fixtures__/main.workflow.1',
-  'utf8'
-);
-
-const workflow2 = readFileSync(
-  'lib/manager/github-actions/__fixtures__/workflow.yml.1',
-  'utf8'
-);
-
-describe('manager/github-actions/update', () => {
-  describe('updateDependency', () => {
-    it('replaces existing uses value', () => {
-      const upgrade = {
-        managerData: { lineNumber: 11 },
-        depName: 'replicated/dockerfilelint',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: workflow1, upgrade });
-      expect(res).not.toEqual(workflow1);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('returns same', () => {
-      const upgrade = {
-        managerData: { lineNumber: 11 },
-        depName: 'replicated/dockerfilelint',
-      };
-      const res = updateDependency({ fileContent: workflow1, upgrade });
-      expect(res).toEqual(workflow1);
-    });
-    it('returns null if mismatch', () => {
-      const upgrade = {
-        managerData: { lineNumber: 12 },
-        newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: workflow1, upgrade });
-      expect(res).toBeNull();
-    });
-    it('returns null if error', () => {
-      const res = updateDependency({ fileContent: null, upgrade: null });
-      expect(res).toBeNull();
-    });
-    it('replaces existing uses value in yaml file', () => {
-      const upgrade = {
-        managerData: { lineNumber: 17 },
-        depName: 'replicated/dockerfilelint',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: workflow2, upgrade });
-      expect(res).not.toEqual(workflow2);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('returns same in yaml file', () => {
-      const upgrade = {
-        managerData: { lineNumber: 17 },
-        depName: 'replicated/dockerfilelint',
-      };
-      const res = updateDependency({ fileContent: workflow2, upgrade });
-      expect(res).toEqual(workflow2);
-    });
-    it('returns null if mismatch in yaml file', () => {
-      const upgrade = {
-        managerData: { lineNumber: 12 },
-        newFrom: 'registry:2.6.2@sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: workflow2, upgrade });
-      expect(res).toBeNull();
-    });
-  });
-});
diff --git a/lib/manager/github-actions/update.ts b/lib/manager/github-actions/update.ts
deleted file mode 100644
index 0b005bbf0d680cec4cb655a4971fc253c4fd3419..0000000000000000000000000000000000000000
--- a/lib/manager/github-actions/update.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { logger } from '../../logger';
-import { getNewFrom } from '../dockerfile/update';
-import { UpdateDependencyConfig } from '../common';
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  try {
-    const newFrom = getNewFrom(upgrade);
-    logger.debug(`github-actions.updateDependency(): ${newFrom}`);
-    const lines = fileContent.split('\n');
-    const lineToChange = lines[upgrade.managerData.lineNumber];
-    const imageLine = /^(.+docker:\/\/)[^"]+("\s*)?$/;
-    if (!imageLine.test(lineToChange)) {
-      logger.debug('No image line found');
-      return null;
-    }
-    const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`);
-    if (newLine === lineToChange) {
-      logger.debug('No changes necessary');
-      return fileContent;
-    }
-    lines[upgrade.managerData.lineNumber] = newLine;
-    return lines.join('\n');
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new github-actions value');
-    return null;
-  }
-}
diff --git a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
index 507c0c20f5b84ffdaea2a9be9177d4dd9a368784..2cdb5646846d0f06fea8be5238d40cde0bd6e1f9 100644
--- a/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/gitlabci/__snapshots__/extract.spec.ts.snap
@@ -8,9 +8,7 @@ Array [
     "datasource": "docker",
     "depName": "hadolint/hadolint",
     "depType": "image",
-    "managerData": Object {
-      "lineNumber": 36,
-    },
+    "replaceString": "hadolint/hadolint:latest",
   },
   Object {
     "currentDigest": undefined,
@@ -18,9 +16,7 @@ Array [
     "datasource": "docker",
     "depName": "docker",
     "depType": "image",
-    "managerData": Object {
-      "lineNumber": 53,
-    },
+    "replaceString": "docker:latest",
   },
   Object {
     "currentDigest": undefined,
@@ -28,9 +24,7 @@ Array [
     "datasource": "docker",
     "depName": "docker",
     "depType": "service-image",
-    "managerData": Object {
-      "lineNumber": 55,
-    },
+    "replaceString": "docker:dind",
   },
   Object {
     "currentDigest": undefined,
@@ -38,9 +32,7 @@ Array [
     "datasource": "docker",
     "depName": "docker",
     "depType": "image",
-    "managerData": Object {
-      "lineNumber": 75,
-    },
+    "replaceString": "docker:latest",
   },
   Object {
     "currentDigest": undefined,
@@ -48,9 +40,7 @@ Array [
     "datasource": "docker",
     "depName": "docker",
     "depType": "service-image",
-    "managerData": Object {
-      "lineNumber": 77,
-    },
+    "replaceString": "docker:dind",
   },
   Object {
     "currentDigest": undefined,
@@ -58,9 +48,7 @@ Array [
     "datasource": "docker",
     "depName": "image-name-test",
     "depType": "image-name",
-    "managerData": Object {
-      "lineNumber": 102,
-    },
+    "replaceString": "image-name-test:1.15",
   },
 ]
 `;
@@ -73,9 +61,7 @@ Array [
     "datasource": "docker",
     "depName": "renovate/renovate",
     "depType": "image-name",
-    "managerData": Object {
-      "lineNumber": 2,
-    },
+    "replaceString": "renovate/renovate:19.70.8-slim",
   },
   Object {
     "currentDigest": undefined,
@@ -83,9 +69,7 @@ Array [
     "datasource": "docker",
     "depName": "mariadb",
     "depType": "service-image",
-    "managerData": Object {
-      "lineNumber": 6,
-    },
+    "replaceString": "mariadb:10.4.11",
   },
   Object {
     "currentDigest": undefined,
@@ -93,9 +77,7 @@ Array [
     "datasource": "docker",
     "depName": "other/image",
     "depType": "service-image",
-    "managerData": Object {
-      "lineNumber": 8,
-    },
+    "replaceString": "other/image:1.0.0",
   },
 ]
 `;
diff --git a/lib/manager/gitlabci/extract.ts b/lib/manager/gitlabci/extract.ts
index e938a2e996d691aa05bb816dd631f4970d1d29da..54955a6c6e450c732159550e7e9fbf6c7fb1561b 100644
--- a/lib/manager/gitlabci/extract.ts
+++ b/lib/manager/gitlabci/extract.ts
@@ -34,7 +34,6 @@ export function extractPackageFile(content: string): PackageFile | null {
               logger.trace(`Matched image name on line ${lineNumber}`);
               const currentFrom = imageNameMatch[1];
               const dep = getDep(currentFrom);
-              dep.managerData = { lineNumber };
               dep.depType = 'image-name';
               deps.push(dep);
             }
@@ -44,7 +43,6 @@ export function extractPackageFile(content: string): PackageFile | null {
             logger.trace(`Matched image on line ${lineNumber}`);
             const currentFrom = imageMatch[1];
             const dep = getDep(currentFrom);
-            dep.managerData = { lineNumber };
             dep.depType = 'image';
             deps.push(dep);
           }
@@ -67,7 +65,6 @@ export function extractPackageFile(content: string): PackageFile | null {
             const currentFrom = serviceImageMatch[1];
             lineNumber = serviceImageLine.lineNumber;
             const dep = getDep(currentFrom);
-            dep.managerData = { lineNumber };
             dep.depType = 'service-image';
             deps.push(dep);
           }
diff --git a/lib/manager/gitlabci/index.ts b/lib/manager/gitlabci/index.ts
index 049a65d665af3a722f8fcfb7c106adc5c89b41c7..3251a4153f80cabdc30ad41f7ffa94ac7a118188 100644
--- a/lib/manager/gitlabci/index.ts
+++ b/lib/manager/gitlabci/index.ts
@@ -1,10 +1,9 @@
 import { extractPackageFile } from './extract';
-import { updateDependency } from './update';
 import { LANGUAGE_DOCKER } from '../../constants/languages';
 
 const language = LANGUAGE_DOCKER;
 
-export { extractPackageFile, language, updateDependency };
+export { extractPackageFile, language };
 
 export const defaultConfig = {
   fileMatch: ['^\\.gitlab-ci\\.yml$'],
diff --git a/lib/manager/gitlabci/update.spec.ts b/lib/manager/gitlabci/update.spec.ts
deleted file mode 100644
index cc1538e28de11fb0ce51077f8651ad9d3719eb1c..0000000000000000000000000000000000000000
--- a/lib/manager/gitlabci/update.spec.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import { readFileSync } from 'fs';
-import { updateDependency } from './update';
-
-const yamlFile = readFileSync(
-  'lib/manager/gitlabci/__fixtures__/gitlab-ci.yaml',
-  'utf8'
-);
-
-describe('manager/gitlabci/update', () => {
-  describe('updateDependency', () => {
-    it('replaces existing value', () => {
-      const upgrade = {
-        managerData: { lineNumber: 36 },
-        depType: 'image',
-        depName: 'hadolint/hadolint',
-        newValue: '7.0.0',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).not.toEqual(yamlFile);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('returns same', () => {
-      const upgrade = {
-        depType: 'image',
-        managerData: { lineNumber: 36 },
-        depName: 'hadolint/hadolint',
-        newValue: 'latest',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toEqual(yamlFile);
-    });
-    it('returns null if mismatch', () => {
-      const upgrade = {
-        managerData: { lineNumber: 17 },
-        depType: 'image',
-        depName: 'postgres',
-        newValue: '9.6.8',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toBeNull();
-    });
-    it('replaces image-name value', () => {
-      const upgrade = {
-        managerData: { lineNumber: 102 },
-        depType: 'image-name',
-        depName: 'image-name-test',
-        newValue: '1.35',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).not.toEqual(yamlFile);
-    });
-    it('returns same image-name value', () => {
-      const upgrade = {
-        managerData: { lineNumber: 102 },
-        depType: 'image-name',
-        depName: 'image-name-test',
-        newValue: '1.15',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toEqual(yamlFile);
-    });
-    it('replaces service-image update', () => {
-      const upgrade = {
-        managerData: { lineNumber: 55 },
-        depType: 'service-image',
-        depName: 'hadolint/hadolint',
-        newValue: '7.0.0',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).not.toEqual(yamlFile);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('returns null if service-image mismatch', () => {
-      const upgrade = {
-        managerData: { lineNumber: 17 },
-        depType: 'service-image',
-        depName: 'postgres',
-        newValue: '9.6.8',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toBeNull();
-    });
-    it('returns service-image same', () => {
-      const upgrade = {
-        depType: 'serviceimage',
-        managerData: { lineNumber: 55 },
-        depName: 'docker',
-        newValue: 'dind',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toEqual(yamlFile);
-    });
-    it('returns null if error', () => {
-      const res = updateDependency({ fileContent: null, upgrade: null });
-      expect(res).toBeNull();
-    });
-  });
-});
diff --git a/lib/manager/gitlabci/update.ts b/lib/manager/gitlabci/update.ts
deleted file mode 100644
index bdd29099001ad2413224154ff17f4b4c8377b5ce..0000000000000000000000000000000000000000
--- a/lib/manager/gitlabci/update.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { logger } from '../../logger';
-import { getNewFrom } from '../dockerfile/update';
-import { UpdateDependencyConfig } from '../common';
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  try {
-    const newFrom = getNewFrom(upgrade);
-    const lines = fileContent.split('\n');
-    const lineToChange = lines[upgrade.managerData.lineNumber];
-    if (['image', 'image-name'].includes(upgrade.depType)) {
-      const imageLine = /^(\s*(?:image|name):\s*'?"?)[^\s'"]+('?"?\s*)$/;
-      if (!imageLine.test(lineToChange)) {
-        logger.debug('No image line found');
-        return null;
-      }
-      const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`);
-      if (newLine === lineToChange) {
-        logger.debug('No changes necessary');
-        return fileContent;
-      }
-      lines[upgrade.managerData.lineNumber] = newLine;
-      return lines.join('\n');
-    }
-    const serviceLine = /^(\s*-\s*'?"?)[^\s'"]+('?"?\s*)$/;
-    if (!serviceLine.test(lineToChange)) {
-      logger.debug('No image line found');
-      return null;
-    }
-    const newLine = lineToChange.replace(serviceLine, `$1${newFrom}$2`);
-    if (newLine === lineToChange) {
-      logger.debug('No changes necessary');
-      return fileContent;
-    }
-    lines[upgrade.managerData.lineNumber] = newLine;
-    return lines.join('\n');
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new Dockerfile value');
-    return null;
-  }
-}
diff --git a/lib/manager/helm-values/__snapshots__/extract.spec.ts.snap b/lib/manager/helm-values/__snapshots__/extract.spec.ts.snap
index 639a6cd8a38bfad7663a019c99b9558697d1c0c0..6f844977577f96583bceb4c951a4d633cad50945 100644
--- a/lib/manager/helm-values/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/helm-values/__snapshots__/extract.spec.ts.snap
@@ -8,18 +8,21 @@ Object {
       "currentValue": "11.6.0-debian-9-r0",
       "datasource": "docker",
       "depName": "bitnami/postgresql",
+      "replaceString": "bitnami/postgresql:11.6.0-debian-9-r0",
     },
     Object {
       "currentDigest": undefined,
       "currentValue": "0.7.0-debian-9-r12",
       "datasource": "docker",
       "depName": "docker.io/bitnami/postgres-exporter",
+      "replaceString": "docker.io/bitnami/postgres-exporter:0.7.0-debian-9-r12",
     },
     Object {
       "currentDigest": undefined,
       "currentValue": "11.5.0-debian-9-r0",
       "datasource": "docker",
       "depName": "docker.io/bitnami/postgresql",
+      "replaceString": "docker.io/bitnami/postgresql:11.5.0-debian-9-r0",
     },
   ],
 }
@@ -33,6 +36,7 @@ Object {
       "currentValue": "1.16.1",
       "datasource": "docker",
       "depName": "nginx",
+      "replaceString": "nginx:1.16.1",
     },
   ],
 }
diff --git a/lib/manager/helm-values/__snapshots__/update.spec.ts.snap b/lib/manager/helm-values/__snapshots__/update.spec.ts.snap
deleted file mode 100644
index 817ed37a3af75a28e35170eb8552fc277b9922ae..0000000000000000000000000000000000000000
--- a/lib/manager/helm-values/__snapshots__/update.spec.ts.snap
+++ /dev/null
@@ -1,53 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`lib/manager/helm-values/update updateDependency() survives null values of keys 1`] = `
-"
-      empty_key:
-      image:
-        repository: bitnami/postgres-exporter
-        tag: 0.8.0
-"
-`;
-
-exports[`lib/manager/helm-values/update updateDependency() upgrades correct dependency if registry included 1`] = `
-"
-      db:
-        image:
-          image:
-            repository: bitnami/postgresql
-            tag: 11.6.0-debian-9-r0
-            some-non-image-related-key: 'with-some-value'
-      warehouse:
-        image:
-          registry: docker.io
-          repository: bitnami/postgresql
-          tag: 12.5.0
-          some-non-image-related-key: 'with-some-value'
-"
-`;
-
-exports[`lib/manager/helm-values/update updateDependency() upgrades dependency if newValue version value is repeated 1`] = `
-"
-      db:
-        image:
-          image:
-            registry: docker.io
-            repository: bitnami/postgresql
-            tag: 12.5.0
-            some-non-image-related-key: 'with-some-value'
-      warehouse:
-        image:
-          registry: docker.io
-          repository: bitnami/postgresql
-          tag: 11.6.0-debian-9-r0
-          some-non-image-related-key: 'with-some-value'
-"
-`;
-
-exports[`lib/manager/helm-values/update updateDependency() upgrades dependency if valid upgrade 1`] = `
-"
-      image:
-        repository: bitnami/postgres-exporter
-        tag: 0.8.0
-"
-`;
diff --git a/lib/manager/helm-values/index.ts b/lib/manager/helm-values/index.ts
index bb544cc0754783adbdef2277b05ed44cdca9d5c9..455e99092fcb3bb5649f02739d8ff1fb504c8351 100644
--- a/lib/manager/helm-values/index.ts
+++ b/lib/manager/helm-values/index.ts
@@ -1,5 +1,4 @@
 export { extractPackageFile } from './extract';
-export { updateDependency } from './update';
 
 export const defaultConfig = {
   commitMessageTopic: 'helm values {{depName}}',
diff --git a/lib/manager/helm-values/update.spec.ts b/lib/manager/helm-values/update.spec.ts
deleted file mode 100644
index 4ec85ed711a2f21b938393fc4cb25238a09de5a0..0000000000000000000000000000000000000000
--- a/lib/manager/helm-values/update.spec.ts
+++ /dev/null
@@ -1,131 +0,0 @@
-import { updateDependency } from './update';
-
-describe('lib/manager/helm-values/update', () => {
-  describe('updateDependency()', () => {
-    it('returns the same fileContent for undefined upgrade', () => {
-      const fileContent = 'someKey: "someValue"';
-      const upgrade = undefined;
-
-      expect(updateDependency({ fileContent, upgrade })).toBe(fileContent);
-    });
-    it('returns the same fileContent for invalid values.yaml file', () => {
-      const fileContent = `
-       Invalid values.yaml content.
-      `;
-      const upgrade = {
-        depName: 'bitnami/postgres-exporter',
-        currentValue: '0.7.0-debian-9-r12',
-        datasource: 'docker',
-        newValue: '0.8.0',
-        dockerRepository: 'bitnami/postgres-exporter',
-      };
-      expect(updateDependency({ fileContent, upgrade })).toBe(fileContent);
-    });
-    // https://github.com/renovatebot/renovate/issues/5298
-    it('returns the same fileContent for duplicate key errors', () => {
-      const fileContent = `
-      replicaCount: 1
-      replicaCount: 5
-      `;
-      const upgrade = {
-        depName: 'bitnami/postgres-exporter',
-        currentValue: '0.7.0-debian-9-r12',
-        datasource: 'docker',
-        newValue: '0.8.0',
-        dockerRepository: 'bitnami/postgres-exporter',
-      };
-      expect(updateDependency({ fileContent, upgrade })).toBe(fileContent);
-    });
-    it('returns the same fileContent for empty upgrade', () => {
-      const fileContent = 'someKey: "someValue"';
-      const upgrade = {};
-      expect(updateDependency({ fileContent, upgrade })).toBe(fileContent);
-    });
-    it('returns the same fileContent for null content', () => {
-      const fileContent = null;
-      const upgrade = {};
-      expect(updateDependency({ fileContent, upgrade })).toBe(fileContent);
-    });
-    it('upgrades dependency if valid upgrade', () => {
-      const fileContent = `
-      image:
-        repository: bitnami/postgres-exporter
-        tag: 0.7.0-debian-9-r12
-      `;
-      const upgrade = {
-        depName: 'bitnami/postgres-exporter',
-        currentValue: '0.7.0-debian-9-r12',
-        newValue: '0.8.0',
-        dockerRepository: 'bitnami/postgres-exporter',
-      };
-      expect(updateDependency({ fileContent, upgrade })).not.toBe(fileContent);
-      expect(updateDependency({ fileContent, upgrade })).toMatchSnapshot();
-    });
-    it('survives null values of keys', () => {
-      const fileContent = `
-      empty_key:
-      image:
-        repository: bitnami/postgres-exporter
-        tag: 0.7.0-debian-9-r12
-      `;
-      const upgrade = {
-        depName: 'bitnami/postgres-exporter',
-        currentValue: '0.7.0-debian-9-r12',
-        newValue: '0.8.0',
-        dockerRepository: 'bitnami/postgres-exporter',
-      };
-      expect(updateDependency({ fileContent, upgrade })).not.toBe(fileContent);
-      expect(updateDependency({ fileContent, upgrade })).toMatchSnapshot();
-    });
-    it('upgrades dependency if newValue version value is repeated', () => {
-      const fileContent = `
-      db:
-        image:
-          image:
-            registry: docker.io
-            repository: bitnami/postgresql
-            tag: 11.6.0-debian-9-r0
-            some-non-image-related-key: 'with-some-value'
-      warehouse:
-        image:
-          registry: docker.io
-          repository: bitnami/postgresql
-          tag: 11.6.0-debian-9-r0
-          some-non-image-related-key: 'with-some-value'
-      `;
-      const upgrade = {
-        depName: 'docker.io/bitnami/postgresql',
-        currentValue: '11.6.0-debian-9-r0',
-        newValue: '12.5.0',
-        dockerRepository: 'bitnami/postgresql',
-      };
-      expect(updateDependency({ fileContent, upgrade })).not.toBe(fileContent);
-      expect(updateDependency({ fileContent, upgrade })).toMatchSnapshot();
-    });
-    it('upgrades correct dependency if registry included', () => {
-      const fileContent = `
-      db:
-        image:
-          image:
-            repository: bitnami/postgresql
-            tag: 11.6.0-debian-9-r0
-            some-non-image-related-key: 'with-some-value'
-      warehouse:
-        image:
-          registry: docker.io
-          repository: bitnami/postgresql
-          tag: 11.6.0-debian-9-r0
-          some-non-image-related-key: 'with-some-value'
-      `;
-      const upgrade = {
-        depName: 'docker.io/bitnami/postgresql',
-        currentValue: '11.6.0-debian-9-r0',
-        newValue: '12.5.0',
-        dockerRepository: 'bitnami/postgresql',
-      };
-
-      expect(updateDependency({ fileContent, upgrade })).not.toBe(fileContent);
-      expect(updateDependency({ fileContent, upgrade })).toMatchSnapshot();
-    });
-  });
-});
diff --git a/lib/manager/helm-values/update.ts b/lib/manager/helm-values/update.ts
deleted file mode 100644
index d0ce8ee3a47d295b6c556d07da8492e7c86f92ce..0000000000000000000000000000000000000000
--- a/lib/manager/helm-values/update.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import YAWN from 'yawn-yaml/cjs';
-import { logger } from '../../logger';
-import { UpdateDependencyConfig } from '../common';
-import {
-  matchesHelmValuesDockerHeuristic,
-  HelmDockerImageDependency,
-} from './util';
-
-function shouldUpdate(
-  parentKey: string,
-  data: unknown | HelmDockerImageDependency,
-  dockerRepository: string,
-  currentValue: string,
-  originalRegistryValue: string
-): boolean {
-  return (
-    matchesHelmValuesDockerHeuristic(parentKey, data) &&
-    data.repository === dockerRepository &&
-    data.tag === currentValue &&
-    ((!data.registry && !originalRegistryValue) ||
-      data.registry === originalRegistryValue)
-  );
-}
-
-/**
- * Extract the originally set registry value if it is included in the depName.
- */
-function getOriginalRegistryValue(
-  depName: string,
-  dockerRepository: string
-): string {
-  if (depName.length > dockerRepository.length) {
-    return depName.substring(0, depName.lastIndexOf(dockerRepository) - 1);
-  }
-  return '';
-}
-
-/**
- * Recursive function that walks the yaml strucuture
- * and updates the first match of an 'image' key it finds,
- * if it adheres to the supported structure.
- *
- * @param parsedContent The part of the yaml tree we should look at.
- * @param dockerRepository The docker repository that should be updated.
- * @param currentValue The current version that should be updated.
- * @param newValue The update version that should be set instead of currentValue.
- * @returns True if the parsedContent was updated, false otherwise.
- */
-function updateDoc(
-  parsedContent: object | HelmDockerImageDependency,
-  dockerRepository: string,
-  currentValue: string,
-  newValue: string,
-  originalRegistryValue: string
-): boolean {
-  for (const key of Object.keys(parsedContent)) {
-    if (
-      shouldUpdate(
-        key,
-        parsedContent[key],
-        dockerRepository,
-        currentValue,
-        originalRegistryValue
-      )
-    ) {
-      // the next statement intentionally updates the passed in parameter
-      // with the updated dependency value
-      // eslint-disable-next-line no-param-reassign
-      parsedContent[key].tag = newValue;
-
-      return true;
-    }
-
-    if (parsedContent[key] && typeof parsedContent[key] === 'object') {
-      const foundMatch = updateDoc(
-        parsedContent[key],
-        dockerRepository,
-        currentValue,
-        newValue,
-        originalRegistryValue
-      );
-      if (foundMatch) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  if (
-    !upgrade ||
-    !upgrade.depName ||
-    !upgrade.newValue ||
-    !upgrade.currentValue ||
-    !upgrade.dockerRepository
-  ) {
-    logger.debug('Failed to update dependency, invalid upgrade');
-    return fileContent;
-  }
-
-  try {
-    const yawn = new YAWN(fileContent);
-
-    const doc = yawn.json;
-
-    const originalRegistryValue = getOriginalRegistryValue(
-      upgrade.depName,
-      upgrade.dockerRepository
-    );
-    updateDoc(
-      doc,
-      upgrade.dockerRepository,
-      upgrade.currentValue,
-      upgrade.newValue,
-      originalRegistryValue
-    );
-    yawn.json = doc;
-
-    return yawn.yaml;
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new helm-values value');
-    return fileContent;
-  }
-}
diff --git a/lib/manager/kubernetes/__snapshots__/extract.spec.ts.snap b/lib/manager/kubernetes/__snapshots__/extract.spec.ts.snap
index 7454d333c04212e50722d7ce41e587526b208e80..fdd4afa86c3818c01d8d30a0743e03d60492e61e 100644
--- a/lib/manager/kubernetes/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/kubernetes/__snapshots__/extract.spec.ts.snap
@@ -7,9 +7,7 @@ Array [
     "currentValue": "v2.1.0",
     "datasource": "docker",
     "depName": "quay.io/external_storage/local-volume-provisioner",
-    "managerData": Object {
-      "lineNumber": 14,
-    },
+    "replaceString": "quay.io/external_storage/local-volume-provisioner:v2.1.0",
   },
 ]
 `;
@@ -21,18 +19,14 @@ Array [
     "currentValue": "1.7.9",
     "datasource": "docker",
     "depName": "nginx",
-    "managerData": Object {
-      "lineNumber": 18,
-    },
+    "replaceString": "nginx:1.7.9",
   },
   Object {
     "currentDigest": undefined,
     "currentValue": "v1.11.1",
     "datasource": "docker",
     "depName": "k8s.gcr.io/kube-proxy-amd64",
-    "managerData": Object {
-      "lineNumber": 46,
-    },
+    "replaceString": "k8s.gcr.io/kube-proxy-amd64:v1.11.1",
   },
 ]
 `;
diff --git a/lib/manager/kubernetes/__snapshots__/update.spec.ts.snap b/lib/manager/kubernetes/__snapshots__/update.spec.ts.snap
deleted file mode 100644
index 47e76ca35ebd23c566e4fb9f52ee8224a93ac8a7..0000000000000000000000000000000000000000
--- a/lib/manager/kubernetes/__snapshots__/update.spec.ts.snap
+++ /dev/null
@@ -1,21 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`manager/kubernetes/update updateDependency replaces image inside YAML array 1`] = `
-"apiVersion: apps/v1
-kind: DaemonSet
-metadata:
-  name: local-volume-provisioner
-  namespace: kube-system
-  labels:
-    app: local-volume-provisioner
-spec:
-  selector:
-    matchLabels:
-      app: local-volume-provisioner
-  template:
-    spec:
-      containers:
-      - image: \\"quay.io/external_storage/local-volume-provisioner:v2.2.0\\"
-        name: provisioner
-"
-`;
diff --git a/lib/manager/kubernetes/extract.ts b/lib/manager/kubernetes/extract.ts
index 906080377d0ed57ddbf0c82ab9cc7404ffbd6fe5..3a875e2361c84cc600439b374fe0f49ee72cff3a 100644
--- a/lib/manager/kubernetes/extract.ts
+++ b/lib/manager/kubernetes/extract.ts
@@ -5,7 +5,6 @@ import { PackageFile, PackageDependency } from '../common';
 export function extractPackageFile(content: string): PackageFile | null {
   logger.trace('kubernetes.extractPackageFile()');
   let deps: PackageDependency[] = [];
-  let lineNumber = 0;
 
   const isKubernetesManifest =
     /\s*apiVersion\s*:/.test(content) && /\s*kind\s*:/.test(content);
@@ -26,10 +25,8 @@ export function extractPackageFile(content: string): PackageFile | null {
         },
         'Kubernetes image'
       );
-      dep.managerData = { lineNumber };
       deps.push(dep);
     }
-    lineNumber += 1;
   }
   deps = deps.filter(
     (dep) => !(dep.currentValue && dep.currentValue.includes('${'))
diff --git a/lib/manager/kubernetes/index.ts b/lib/manager/kubernetes/index.ts
index 52e995d9a2de2d830a91fdfef175234cd8046e70..f9b4ba2246df7b9d08ca29893f887cee384b5c55 100644
--- a/lib/manager/kubernetes/index.ts
+++ b/lib/manager/kubernetes/index.ts
@@ -1,7 +1,6 @@
 import { LANGUAGE_DOCKER } from '../../constants/languages';
 
 export { extractPackageFile } from './extract';
-export { updateDependency } from './update';
 
 export const language = LANGUAGE_DOCKER;
 
diff --git a/lib/manager/kubernetes/update.spec.ts b/lib/manager/kubernetes/update.spec.ts
deleted file mode 100644
index a853ed1a0703f25a26bae7283c1576ec6aa2be8a..0000000000000000000000000000000000000000
--- a/lib/manager/kubernetes/update.spec.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { readFileSync } from 'fs';
-import { updateDependency } from './update';
-
-const yamlFile = readFileSync(
-  'lib/manager/kubernetes/__fixtures__/kubernetes.yaml',
-  'utf8'
-);
-
-const arraySyntaxFile = readFileSync(
-  'lib/manager/kubernetes/__fixtures__/array-syntax.yaml',
-  'utf8'
-);
-
-describe('manager/kubernetes/update', () => {
-  describe('updateDependency', () => {
-    it('replaces existing value', () => {
-      const upgrade = {
-        managerData: { lineNumber: 18 },
-        depName: 'nginx',
-        newValue: '1.15.1',
-        newDigest: 'sha256:abcdefghijklmnop',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).not.toEqual(yamlFile);
-      expect(res.includes(upgrade.newDigest)).toBe(true);
-    });
-    it('returns same', () => {
-      const upgrade = {
-        managerData: { lineNumber: 46 },
-        depName: 'k8s.gcr.io/kube-proxy-amd64',
-        newValue: 'v1.11.1',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toEqual(yamlFile);
-    });
-    it('returns null if mismatch', () => {
-      const upgrade = {
-        managerData: { lineNumber: 1 },
-        newFrom: 'k8s.gcr.io/kube-proxy-amd64:v1.11.1',
-      };
-      const res = updateDependency({ fileContent: yamlFile, upgrade });
-      expect(res).toBeNull();
-    });
-    it('returns null if error', () => {
-      const res = updateDependency({ fileContent: null, upgrade: null });
-      expect(res).toBeNull();
-    });
-    it('replaces image inside YAML array', () => {
-      const upgrade = {
-        managerData: { lineNumber: 14 },
-        depName: 'quay.io/external_storage/local-volume-provisioner',
-        newValue: 'v2.2.0',
-      };
-      const res = updateDependency({
-        fileContent: arraySyntaxFile,
-        upgrade,
-      });
-      expect(res).not.toEqual(arraySyntaxFile);
-      expect(res).toMatchSnapshot();
-    });
-  });
-});
diff --git a/lib/manager/kubernetes/update.ts b/lib/manager/kubernetes/update.ts
deleted file mode 100644
index f1ab8c2978cb67a9c5deae78617130b04f8f015d..0000000000000000000000000000000000000000
--- a/lib/manager/kubernetes/update.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { logger } from '../../logger';
-import { getNewFrom } from '../dockerfile/update';
-import { UpdateDependencyConfig } from '../common';
-
-export function updateDependency({
-  fileContent,
-  upgrade,
-}: UpdateDependencyConfig): string | null {
-  try {
-    const newFrom = getNewFrom(upgrade);
-    logger.debug(`kubernetes.updateDependency(): ${newFrom}`);
-    const lines = fileContent.split('\n');
-    const lineToChange = lines[upgrade.managerData.lineNumber];
-    const imageLine = /^(\s*-?\s*image:\s*'?"?)[^\s'"]+('?"?\s*)$/;
-    if (!imageLine.test(lineToChange)) {
-      logger.debug('No image line found');
-      return null;
-    }
-    const newLine = lineToChange.replace(imageLine, `$1${newFrom}$2`);
-    if (newLine === lineToChange) {
-      logger.debug('No changes necessary');
-      return fileContent;
-    }
-    lines[upgrade.managerData.lineNumber] = newLine;
-    return lines.join('\n');
-  } catch (err) {
-    logger.debug({ err }, 'Error setting new Kubernetes value');
-    return null;
-  }
-}
diff --git a/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap b/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap
index 878a1dc30a88ce08a8e4eb2a6bc4730097a5511d..aba6ee470ef45fec82ad7327b35305c66306ae7b 100644
--- a/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap
+++ b/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap
@@ -5,3 +5,5 @@ exports[`workers/branch/auto-replace doAutoReplace handles already updated 1`] =
 exports[`workers/branch/auto-replace doAutoReplace updates version and integrity 1`] = `"     <script src=\\"https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.js\\" integrity=\\"sha256-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" crossorigin=\\"anonymous\\">   "`;
 
 exports[`workers/branch/auto-replace doAutoReplace updates version only 1`] = `"     <script src=\\"https://cdnjs.cloudflare.com/ajax/libs/reactstrap/7.1.1/reactstrap.min.js\\">   "`;
+
+exports[`workers/branch/auto-replace doAutoReplace updates with autoReplaceNewString 1`] = `"FROM node:8.11.4-alpine@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa AS node"`;
diff --git a/lib/workers/branch/auto-replace.spec.ts b/lib/workers/branch/auto-replace.spec.ts
index ba7b8ffcbdaef2f1cb2a56670d9ca53e35237f30..4a1387972daffde738605b8efa07ea76bfe23e57 100644
--- a/lib/workers/branch/auto-replace.spec.ts
+++ b/lib/workers/branch/auto-replace.spec.ts
@@ -98,5 +98,24 @@ describe('workers/branch/auto-replace', () => {
       const res = await doAutoReplace(upgrade, src, parentBranch);
       expect(res).toMatchSnapshot();
     });
+    it('updates with autoReplaceNewString', async () => {
+      const dockerfile =
+        'FROM node:8.11.3-alpine@sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d AS node';
+      upgrade.manager = 'dockerfile';
+      upgrade.depName = 'node';
+      upgrade.lookupName = 'node';
+      upgrade.currentValue = '8.11.3-alpine';
+      upgrade.newValue = '8.11.4-alpine';
+      upgrade.currentDigest =
+        'sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d';
+      upgrade.newDigest = 'sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
+      upgrade.depIndex = 0;
+      upgrade.replaceString =
+        'node:8.11.3-alpine@sha256:d743b4141b02fcfb8beb68f92b4cd164f60ee457bf2d053f36785bf86de16b0d';
+      upgrade.autoReplaceStringTemplate =
+        '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';
+      const res = await doAutoReplace(upgrade, dockerfile, parentBranch);
+      expect(res).toMatchSnapshot();
+    });
   });
 });
diff --git a/lib/workers/branch/auto-replace.ts b/lib/workers/branch/auto-replace.ts
index 3db55742f60c0b723a038227597f2263ff283a61..d7b0a4caacca6fed83b9bf216f17a93280cf0b7a 100644
--- a/lib/workers/branch/auto-replace.ts
+++ b/lib/workers/branch/auto-replace.ts
@@ -3,6 +3,7 @@ import { get } from '../../manager';
 import { WORKER_FILE_UPDATE_FAILED } from '../../constants/error-messages';
 import { matchAt, replaceAt } from '../../util/string';
 import { regEx, escapeRegExp } from '../../util/regex';
+import { compile } from '../../util/template';
 
 export async function confirmIfDepUpdated(
   upgrade,
@@ -71,7 +72,14 @@ export async function doAutoReplace(
     logger.debug('Branch dep is already updated');
     return existingContent;
   }
-  const { depName, currentValue, newValue, currentDigest, newDigest } = upgrade;
+  const {
+    depName,
+    currentValue,
+    newValue,
+    currentDigest,
+    newDigest,
+    autoReplaceStringTemplate,
+  } = upgrade;
   const replaceString = upgrade.replaceString || currentValue;
   logger.trace({ depName, replaceString }, 'autoReplace replaceString');
   let searchIndex = existingContent.indexOf(replaceString);
@@ -83,15 +91,23 @@ export async function doAutoReplace(
     return existingContent;
   }
   try {
-    let newString = replaceString.replace(
-      regEx(escapeRegExp(currentValue), 'g'),
-      newValue
-    );
-    if (currentDigest && newDigest) {
-      newString = newString.replace(
-        regEx(escapeRegExp(currentDigest), 'g'),
-        newDigest
-      );
+    let newString: string;
+    if (autoReplaceStringTemplate) {
+      newString = compile(autoReplaceStringTemplate, upgrade, false);
+    } else {
+      newString = replaceString;
+      if (currentValue) {
+        newString = newString.replace(
+          regEx(escapeRegExp(currentValue), 'g'),
+          newValue
+        );
+      }
+      if (currentDigest && newDigest) {
+        newString = newString.replace(
+          regEx(escapeRegExp(currentDigest), 'g'),
+          newDigest
+        );
+      }
     }
     logger.debug(`Starting search at index ${searchIndex}`);
     // Iterate through the rest of the file
diff --git a/package.json b/package.json
index 7e9b4547256025d1865ce5bc1ccd4adb7f1e15c6..c3c5935396200aac6ff952f9d79aa0bf6047742d 100644
--- a/package.json
+++ b/package.json
@@ -170,8 +170,7 @@
     "validate-npm-package-name": "3.0.0",
     "www-authenticate": "0.6.2",
     "xmldoc": "1.1.2",
-    "yarn": "1.22.4",
-    "yawn-yaml": "1.5.0"
+    "yarn": "1.22.4"
   },
   "optionalDependencies": {
     "re2": "1.10.5"
@@ -221,7 +220,6 @@
     "@types/tmp": "0.1.0",
     "@types/traverse": "0.6.32",
     "@types/xmldoc": "1.1.4",
-    "@types/yawn-yaml": "1.4.0",
     "@typescript-eslint/eslint-plugin": "2.27.0",
     "@typescript-eslint/parser": "2.27.0",
     "aws-sdk-mock": "5.1.0",
diff --git a/yarn.lock b/yarn.lock
index bf37a75baf6d3006102d61923c6d14575c2c9489..86bcd18db4505839d5686edfa7564f122bd15d67 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1478,11 +1478,16 @@
   resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.3.tgz#abf383c5b639d0aa8b8c4a420d6a85f703357d6c"
   integrity sha512-otRe77JNNWzoVGLKw8TCspKswRoQToys4tuL6XYVBFxjgeM0RUrx7m3jkaTdxILxeGry3zM8mGYkGXMeQ02guA==
 
-"@types/json-schema@*", "@types/json-schema@^7.0.3":
+"@types/json-schema@*":
   version "7.0.4"
   resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
   integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
 
+"@types/json-schema@^7.0.3":
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636"
+  integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==
+
 "@types/json5@0.0.30":
   version "0.0.30"
   resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.30.tgz#44cb52f32a809734ca562e685c6473b5754a7818"
@@ -1652,11 +1657,6 @@
   dependencies:
     "@types/yargs-parser" "*"
 
-"@types/yawn-yaml@1.4.0":
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/@types/yawn-yaml/-/yawn-yaml-1.4.0.tgz#15e1c5722c9253d6da6a927d85ba34b2f34a3a02"
-  integrity sha512-9mfVO9Po29PF6lH24v3+5BCBXhnH+o3r9I6xRzU+AECT1cdlR/mNqk6NK2kTFGyo0vt8o4isjpq3V5iG3VmvFQ==
-
 "@typescript-eslint/eslint-plugin@2.27.0":
   version "2.27.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.27.0.tgz#e479cdc4c9cf46f96b4c287755733311b0d0ba4b"
@@ -1667,6 +1667,16 @@
     regexpp "^3.0.0"
     tsutils "^3.17.1"
 
+"@typescript-eslint/experimental-utils@2.26.0":
+  version "2.26.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz#063390c404d9980767d76274df386c0aa675d91d"
+  integrity sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==
+  dependencies:
+    "@types/json-schema" "^7.0.3"
+    "@typescript-eslint/typescript-estree" "2.26.0"
+    eslint-scope "^5.0.0"
+    eslint-utils "^2.0.0"
+
 "@typescript-eslint/experimental-utils@2.27.0":
   version "2.27.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a"
@@ -1677,7 +1687,7 @@
     eslint-scope "^5.0.0"
     eslint-utils "^2.0.0"
 
-"@typescript-eslint/parser@2.27.0", "@typescript-eslint/parser@^2.3.0":
+"@typescript-eslint/parser@2.27.0":
   version "2.27.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.27.0.tgz#d91664335b2c46584294e42eb4ff35838c427287"
   integrity sha512-HFUXZY+EdwrJXZo31DW4IS1ujQW3krzlRjBrFRrJcMDh0zCu107/nRfhk/uBasO8m0NVDbBF5WZKcIUMRO7vPg==
@@ -1687,6 +1697,29 @@
     "@typescript-eslint/typescript-estree" "2.27.0"
     eslint-visitor-keys "^1.1.0"
 
+"@typescript-eslint/parser@^2.3.0":
+  version "2.26.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f"
+  integrity sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==
+  dependencies:
+    "@types/eslint-visitor-keys" "^1.0.0"
+    "@typescript-eslint/experimental-utils" "2.26.0"
+    "@typescript-eslint/typescript-estree" "2.26.0"
+    eslint-visitor-keys "^1.1.0"
+
+"@typescript-eslint/typescript-estree@2.26.0":
+  version "2.26.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz#d8132cf1ee8a72234f996519a47d8a9118b57d56"
+  integrity sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==
+  dependencies:
+    debug "^4.1.1"
+    eslint-visitor-keys "^1.1.0"
+    glob "^7.1.6"
+    is-glob "^4.0.1"
+    lodash "^4.17.15"
+    semver "^6.3.0"
+    tsutils "^3.17.1"
+
 "@typescript-eslint/typescript-estree@2.27.0":
   version "2.27.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz#a288e54605412da8b81f1660b56c8b2e42966ce8"
@@ -5571,7 +5604,7 @@ jmespath@0.15.0:
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-yaml@3.13.1, js-yaml@^3.13.1, js-yaml@^3.4.2:
+js-yaml@3.13.1, js-yaml@^3.13.1:
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
   integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -6100,7 +6133,7 @@ lodash.without@~4.4.0:
   resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
   integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=
 
-lodash@4.17.15, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4:
+lodash@4.17.15, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -10172,11 +10205,6 @@ yallist@^4.0.0:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
   integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
 
-yaml-js@^0.1.3:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/yaml-js/-/yaml-js-0.1.5.tgz#a01369010b3558d8aaed2394615dfd0780fd8fac"
-  integrity sha1-oBNpAQs1WNiq7SOUYV39B4D9j6w=
-
 yaml@^1.7.2:
   version "1.7.2"
   resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2"
@@ -10245,12 +10273,3 @@ yarn@1.22.4:
   version "1.22.4"
   resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.4.tgz#01c1197ca5b27f21edc8bc472cd4c8ce0e5a470e"
   integrity sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA==
-
-yawn-yaml@1.5.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/yawn-yaml/-/yawn-yaml-1.5.0.tgz#95fba7544d5375fce3dc84514f12218ed0d2ebcb"
-  integrity sha512-sH2zX9K1QiWhWh9U19pye660qlzrEAd5c4ebw/6lqz17LZw7xYi7nqXlBoVLVtc2FZFXDKiJIsvVcKGYbLVyFQ==
-  dependencies:
-    js-yaml "^3.4.2"
-    lodash "^4.17.11"
-    yaml-js "^0.1.3"