diff --git a/lib/modules/manager/poetry/__snapshots__/artifacts.spec.ts.snap b/lib/modules/manager/poetry/__snapshots__/artifacts.spec.ts.snap
index 0fd3a97eee973e08b4456efc998b01bd01500960..8667b51321216312de03890c210f032a746417ce 100644
--- a/lib/modules/manager/poetry/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/modules/manager/poetry/__snapshots__/artifacts.spec.ts.snap
@@ -112,19 +112,19 @@ Array [
 exports[`modules/manager/poetry/artifacts returns updated poetry.lock using docker (constraints) 1`] = `
 Array [
   Object {
-    "cmd": "docker pull renovate/python:2.7.5",
+    "cmd": "docker pull renovate/sidecar",
     "options": Object {
       "encoding": "utf-8",
     },
   },
   Object {
-    "cmd": "docker ps --filter name=renovate_python -aq",
+    "cmd": "docker ps --filter name=renovate_sidecar -aq",
     "options": Object {
       "encoding": "utf-8",
     },
   },
   Object {
-    "cmd": "docker run --rm --name=renovate_python --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -v \\"/tmp/cache\\":\\"/tmp/cache\\" -e BUILDPACK_CACHE_DIR -w \\"/tmp/github/some/repo\\" renovate/python:2.7.5 bash -l -c \\"install-tool poetry 1.2.0 && poetry update --lock --no-interaction dep1\\"",
+    "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -v \\"/tmp/cache\\":\\"/tmp/cache\\" -e BUILDPACK_CACHE_DIR -w \\"/tmp/github/some/repo\\" renovate/sidecar bash -l -c \\"install-tool python 1.2.0 && pip install --user 'poetry>=1.0' && poetry update --lock --no-interaction dep1\\"",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
@@ -148,19 +148,19 @@ Array [
 exports[`modules/manager/poetry/artifacts returns updated poetry.lock using docker 1`] = `
 Array [
   Object {
-    "cmd": "docker pull renovate/python:3.4.2",
+    "cmd": "docker pull renovate/sidecar",
     "options": Object {
       "encoding": "utf-8",
     },
   },
   Object {
-    "cmd": "docker ps --filter name=renovate_python -aq",
+    "cmd": "docker ps --filter name=renovate_sidecar -aq",
     "options": Object {
       "encoding": "utf-8",
     },
   },
   Object {
-    "cmd": "docker run --rm --name=renovate_python --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -v \\"/tmp/cache\\":\\"/tmp/cache\\" -e BUILDPACK_CACHE_DIR -w \\"/tmp/github/some/repo\\" renovate/python:3.4.2 bash -l -c \\"install-tool poetry 1.2.0 && poetry update --lock --no-interaction dep1\\"",
+    "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -v \\"/tmp/cache\\":\\"/tmp/cache\\" -e BUILDPACK_CACHE_DIR -w \\"/tmp/github/some/repo\\" renovate/sidecar bash -l -c \\"install-tool python 1.2.0 && pip install --user 'poetry>=1.0' && poetry update --lock --no-interaction dep1\\"",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
diff --git a/lib/modules/manager/poetry/artifacts.spec.ts b/lib/modules/manager/poetry/artifacts.spec.ts
index a4450781c1b95ce1d0459e14c2457aff8f35ce5f..49432cc37442bcdfa99cdb42dede11d5dff44d17 100644
--- a/lib/modules/manager/poetry/artifacts.spec.ts
+++ b/lib/modules/manager/poetry/artifacts.spec.ts
@@ -19,6 +19,8 @@ jest.mock('../../../util/exec/env');
 jest.mock('../../datasource');
 jest.mock('../../../util/host-rules');
 
+process.env.BUILDPACK = 'true';
+
 const fs: jest.Mocked<typeof _fs> = _fs as any;
 const datasource = mocked(_datasource);
 const hostRules = mocked(_hostRules);
@@ -233,6 +235,57 @@ describe('modules/manager/poetry/artifacts', () => {
     expect(execSnapshots).toMatchSnapshot();
   });
 
+  it('returns updated poetry.lock using install mode', async () => {
+    GlobalConfig.set({ ...adminConfig, binarySource: 'install' });
+    // poetry.lock
+    fs.readFile.mockResolvedValueOnce(
+      '[metadata]\npython-versions = "~2.7 || ^3.4"' as any
+    );
+    const execSnapshots = mockExecAll();
+    fs.readFile.mockReturnValueOnce('New poetry.lock' as any);
+    // poetry
+    datasource.getPkgReleases.mockResolvedValueOnce({
+      releases: [
+        { version: '1.0.0' },
+        { version: '1.1.0' },
+        { version: '1.2.0' },
+      ],
+    });
+    // python
+    datasource.getPkgReleases.mockResolvedValueOnce({
+      releases: [{ version: '2.7.5' }, { version: '3.3.2' }],
+    });
+    const updatedDeps = [{ depName: 'dep1' }];
+    expect(
+      await updateArtifacts({
+        packageFileName: 'pyproject.toml',
+        updatedDeps,
+        newPackageFileContent: pyproject1toml,
+        config: {
+          ...config,
+          constraints: {},
+        },
+      })
+    ).toEqual([
+      {
+        file: {
+          type: 'addition',
+          path: 'poetry.lock',
+          contents: 'New poetry.lock',
+        },
+      },
+    ]);
+
+    expect(execSnapshots).toMatchObject([
+      { cmd: 'install-tool python 1.2.0' },
+      { cmd: "pip install --user 'poetry>=1.0'" },
+      {
+        cmd: 'poetry update --lock --no-interaction dep1',
+        options: { cwd: '/tmp/github/some/repo' },
+      },
+    ]);
+  });
+
   it('catches errors', async () => {
     fs.readFile.mockResolvedValueOnce('Current poetry.lock' as any);
     fs.outputFile.mockImplementationOnce(() => {
diff --git a/lib/modules/manager/poetry/artifacts.ts b/lib/modules/manager/poetry/artifacts.ts
index 52aaf61aa42b3e8cb6e03fb392d0abbd249b2c1b..385e8f6040e5e9de33a7f993c6e42d76ba99386b 100644
--- a/lib/modules/manager/poetry/artifacts.ts
+++ b/lib/modules/manager/poetry/artifacts.ts
@@ -5,7 +5,7 @@ import { TEMPORARY_ERROR } from '../../../constants/error-messages';
 import { logger } from '../../../logger';
 import type { HostRule } from '../../../types';
 import { exec } from '../../../util/exec';
-import type { ExecOptions, ToolConstraint } from '../../../util/exec/types';
+import type { ExecOptions } from '../../../util/exec/types';
 import {
   deleteLocalFile,
   getSiblingFileName,
@@ -172,27 +172,24 @@ export async function updateArtifacts({
           .join(' ')}`
       );
     }
-    const tagConstraint = getPythonConstraint(existingLockFileContent, config);
-    const constraint =
+    const constraint = getPythonConstraint(existingLockFileContent, config);
+    const poetryVersion =
       config.constraints?.poetry ?? getPoetryRequirement(newPackageFileContent);
     const extraEnv = getSourceCredentialVars(
       newPackageFileContent,
       packageFileName
     );
-    const toolConstraint: ToolConstraint = {
-      toolName: 'poetry',
-      constraint,
-    };
 
     const execOptions: ExecOptions = {
       cwdFile: packageFileName,
       extraEnv,
       docker: {
-        image: 'python',
-        tagConstraint,
-        tagScheme: 'poetry',
+        image: 'sidecar',
       },
-      toolConstraints: [toolConstraint],
+      toolConstraints: [{ toolName: 'python', constraint }],
+      preCommands: [
+        `pip install --user ${quote(`poetry${poetryVersion ?? ''}`)}`,
+      ],
     };
     await exec(cmd, execOptions);
     const newPoetryLockContent = await readLocalFile(lockFileName, 'utf8');