Optimize Docker image pull

This commit is contained in:
Art Chaidarun 2025-11-07 21:55:44 -05:00
parent 65175f3cf3
commit 7c64e47d93
2 changed files with 45 additions and 2 deletions

View file

@ -23,9 +23,18 @@ def run_hook(
require_serial: bool,
color: bool,
) -> tuple[int, bytes]: # pragma: win32 no cover
cmd = docker_cmd(color=color) + lang_base.hook_cmd(entry, args)
cmd = lang_base.hook_cmd(entry, args)
# To prevent duplicate simultaneous image pull attempts in `run_xargs`, we
# try to precache the Docker image by pulling it here first
try:
image_name = cmd[2 if cmd[0] == '--entrypoint' else 0]
lang_base.setup_cmd(prefix, ('docker', 'pull', image_name))
except Exception:
pass
return lang_base.run_xargs(
cmd,
docker_cmd(color=color) + cmd,
file_args,
require_serial=require_serial,
color=color,

View file

@ -1,5 +1,7 @@
from __future__ import annotations
from unittest.mock import patch
import pytest
from pre_commit.languages import docker_image
@ -57,3 +59,35 @@ def test_docker_image_no_color_no_tty(tmp_path):
color=False,
)
assert ret == (0, b'root:x:0:\n')
@xfailif_windows # pragma: win32 no cover
@patch('pre_commit.lang_base.setup_cmd')
def test_docker_image_pre_pull_regular_entry(mock_setup, tmp_path):
ret = run_language(
tmp_path,
docker_image,
'ubuntu:22.04 echo',
args=('hello hello world',),
)
mock_setup.assert_called_once_with(
mock_setup.call_args[0][0],
('docker', 'pull', 'ubuntu:22.04'),
)
assert ret == (0, b'hello hello world\n')
@xfailif_windows # pragma: win32 no cover
@patch('pre_commit.lang_base.setup_cmd')
def test_docker_image_pre_pull_entrypoint_entry(mock_setup, tmp_path):
ret = run_language(
tmp_path,
docker_image,
'--entrypoint echo ubuntu:22.04',
args=('hello hello world',),
)
mock_setup.assert_called_once_with(
mock_setup.call_args[0][0],
('docker', 'pull', 'ubuntu:22.04'),
)
assert ret == (0, b'hello hello world\n')