diff --git a/lib/manager/poetry/artifacts.ts b/lib/manager/poetry/artifacts.ts
index 7c0ea5d3481dc4ac00382e5bcbc8ae22502dd582..fb86ed27062267d18c558a454fac5bf0d6db981c 100644
--- a/lib/manager/poetry/artifacts.ts
+++ b/lib/manager/poetry/artifacts.ts
@@ -1,7 +1,6 @@
 import { parse, join } from 'upath';
 import { outputFile, readFile } from 'fs-extra';
-import { exec } from '../../util/exec';
-import { getChildProcessEnv } from '../../util/exec/env';
+import { exec, ExecOptions } from '../../util/exec';
 import { logger } from '../../logger';
 import { UpdateArtifactsConfig, UpdateArtifactsResult } from '../common';
 import { platform } from '../../platform';
@@ -37,30 +36,24 @@ export async function updateArtifacts(
   try {
     await outputFile(localPackageFileName, newPackageFileContent);
     logger.debug(`Updating ${lockFileName}`);
-    const cwd = join(config.localDir, subDirectory);
-    const env = getChildProcessEnv();
-    let cmd: string;
+
+    let cmd = 'poetry';
+    const execOptions: ExecOptions = {
+      cwd: join(config.localDir, subDirectory),
+    };
+
     if (config.binarySource === 'docker') {
       logger.info('Running poetry via docker');
-      cmd = `docker run --rm `;
-      if (config.dockerUser) {
-        cmd += `--user=${config.dockerUser} `;
-      }
-      const volumes = [cwd];
-      cmd += volumes.map(v => `-v "${v}":"${v}" `).join('');
-      cmd += `-w "${cwd}" `;
-      cmd += `renovate/poetry poetry`;
+      execOptions.docker = {
+        image: 'renovate/poetry',
+      };
     } else {
       logger.info('Running poetry via global poetry');
-      cmd = 'poetry';
     }
     for (let i = 0; i < updatedDeps.length; i += 1) {
       const dep = updatedDeps[i];
       cmd += ` update --lock --no-interaction ${dep}`;
-      await exec(cmd, {
-        cwd,
-        env,
-      });
+      await exec(cmd, execOptions);
     }
     const newPoetryLockContent = await readFile(localLockFileName, 'utf8');
     if (existingLockFileContent === newPoetryLockContent) {
diff --git a/test/manager/poetry/__snapshots__/artifacts.spec.ts.snap b/test/manager/poetry/__snapshots__/artifacts.spec.ts.snap
index ecd64a4f2edd2136af275265f2a1b9a6d49daa99..ccb843e4cde8487121c89c1d35a0849995531f28 100644
--- a/test/manager/poetry/__snapshots__/artifacts.spec.ts.snap
+++ b/test/manager/poetry/__snapshots__/artifacts.spec.ts.snap
@@ -53,7 +53,7 @@ Array [
 exports[`.updateArtifacts() returns updated poetry.lock using docker 1`] = `
 Array [
   Object {
-    "cmd": "docker run --rm --user=foobar -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -w \\"/tmp/github/some/repo\\" renovate/poetry poetry update --lock --no-interaction dep1",
+    "cmd": "docker run --rm --user=foobar -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -w \\"/tmp/github/some/repo\\" renovate/poetry bash -l -c \\"poetry update --lock --no-interaction dep1\\"",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
diff --git a/test/manager/poetry/artifacts.spec.ts b/test/manager/poetry/artifacts.spec.ts
index 5ad9d3a09d8fb4f17189c801562fddfa9effe08e..fdae175f1c02178c857670b316ed8520e05fdca6 100644
--- a/test/manager/poetry/artifacts.spec.ts
+++ b/test/manager/poetry/artifacts.spec.ts
@@ -1,3 +1,4 @@
+import { join } from 'upath';
 import _fs from 'fs-extra';
 import { exec as _exec } from 'child_process';
 import { updateArtifacts } from '../../../lib/manager/poetry/artifacts';
@@ -5,6 +6,7 @@ import { platform as _platform } from '../../../lib/platform';
 import { mocked } from '../../util';
 import { envMock, mockExecAll } from '../../execUtil';
 import * as _env from '../../../lib/util/exec/env';
+import { setDockerConfig } from '../../../lib/util/exec/docker';
 
 jest.mock('fs-extra');
 jest.mock('child_process');
@@ -16,13 +18,17 @@ const env = mocked(_env);
 const platform = mocked(_platform);
 
 const config = {
-  localDir: '/tmp/github/some/repo',
+  localDir: join('/tmp/github/some/repo'),
 };
 
 describe('.updateArtifacts()', () => {
   beforeEach(() => {
     jest.resetAllMocks();
     env.getChildProcessEnv.mockReturnValue(envMock.basic);
+    setDockerConfig({
+      ...config,
+      dockerUser: 'foobar',
+    });
   });
   it('returns null if no poetry.lock found', async () => {
     const updatedDeps = ['dep1'];