]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Mount package manager cache directories when running scripts
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 15 Jan 2024 20:29:10 +0000 (21:29 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 16 Jan 2024 10:58:55 +0000 (11:58 +0100)
When running package managers in host scripts we want the cache
to be available as well;

mkosi/__init__.py
mkosi/installer/__init__.py
mkosi/installer/apt.py
mkosi/installer/dnf.py
mkosi/installer/pacman.py
mkosi/installer/zypper.py

index 7503a77a7829f6645bf37db1f2d6c6e2409acf99..723a05dff141570b5f90134610f17893f93c15a2 100644 (file)
@@ -48,7 +48,11 @@ from mkosi.config import (
 )
 from mkosi.context import Context
 from mkosi.distributions import Distribution
-from mkosi.installer import clean_package_manager_metadata, package_manager_scripts
+from mkosi.installer import (
+    clean_package_manager_metadata,
+    finalize_package_manager_mounts,
+    package_manager_scripts,
+)
 from mkosi.kmod import gen_required_kernel_modules, process_kernel_modules
 from mkosi.log import ARG_DEBUG, complete_step, die, log_notice, log_step
 from mkosi.manifest import Manifest
@@ -65,7 +69,7 @@ from mkosi.run import (
     run,
     unshare,
 )
-from mkosi.sandbox import chroot_cmd, finalize_crypto_mounts, finalize_passwd_mounts
+from mkosi.sandbox import chroot_cmd, finalize_passwd_mounts
 from mkosi.tree import copy_tree, move_tree, rmtree
 from mkosi.types import PathString
 from mkosi.util import (
@@ -458,14 +462,10 @@ def run_prepare_scripts(context: Context, build: bool) -> None:
                     sandbox=context.sandbox(
                         network=True,
                         options=sources + [
-                            # If the cache dir is /var and the workspace directory is /var/tmp (e.g. in mkosi-initrd),
-                            # then all the files we mount here might be located in the configured cache directory, so
-                            # we have to mount the cache directory first to not override all the other mounts.
-                            "--bind", context.cache_dir, context.cache_dir,
                             "--ro-bind", script, "/work/prepare",
                             "--ro-bind", cd, "/work/scripts",
                             "--bind", context.root, context.root,
-                            *finalize_crypto_mounts(tools=context.config.tools()),
+                            *finalize_package_manager_mounts(context),
                             "--chdir", "/work/src",
                         ],
                         scripts=hd,
@@ -546,7 +546,7 @@ def run_build_scripts(context: Context) -> None:
                                 if context.config.build_dir
                                 else []
                             ),
-                            *finalize_crypto_mounts(tools=context.config.tools()),
+                            *finalize_package_manager_mounts(context),
                             "--chdir", "/work/src",
                         ],
                         scripts=hd,
@@ -606,7 +606,7 @@ def run_postinst_scripts(context: Context) -> None:
                             "--ro-bind", cd, "/work/scripts",
                             "--bind", context.root, context.root,
                             "--bind", context.staging, "/work/out",
-                            *finalize_crypto_mounts(tools=context.config.tools()),
+                            *finalize_package_manager_mounts(context),
                             "--chdir", "/work/src",
                         ],
                         scripts=hd,
@@ -666,7 +666,7 @@ def run_finalize_scripts(context: Context) -> None:
                             "--ro-bind", cd, "/work/scripts",
                             "--bind", context.root, context.root,
                             "--bind", context.staging, "/work/out",
-                            *finalize_crypto_mounts(tools=context.config.tools()),
+                            *finalize_package_manager_mounts(context),
                             "--chdir", "/work/src",
                         ],
                         scripts=hd,
index 6135e03e0b4b66f7ea8fd249cc3d0a818faea6ce..e4b99722bc4738ab63dbffe59d57e2781bf28e02 100644 (file)
@@ -4,14 +4,10 @@ import os
 
 from mkosi.config import ConfigFeature
 from mkosi.context import Context
-from mkosi.installer.apt import apt_cmd
-from mkosi.installer.dnf import dnf_cmd
-from mkosi.installer.pacman import pacman_cmd
-from mkosi.installer.rpm import rpm_cmd
-from mkosi.installer.zypper import zypper_cmd
-from mkosi.sandbox import apivfs_cmd
+from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
 from mkosi.tree import rmtree
 from mkosi.types import PathString
+from mkosi.util import flatten
 
 
 def clean_package_manager_metadata(context: Context) -> None:
@@ -40,6 +36,12 @@ def clean_package_manager_metadata(context: Context) -> None:
 
 
 def package_manager_scripts(context: Context) -> dict[str, list[PathString]]:
+    from mkosi.installer.apt import apt_cmd
+    from mkosi.installer.dnf import dnf_cmd
+    from mkosi.installer.pacman import pacman_cmd
+    from mkosi.installer.rpm import rpm_cmd
+    from mkosi.installer.zypper import zypper_cmd
+
     return {
         "pacman": apivfs_cmd(context.root) + pacman_cmd(context),
         "zypper": apivfs_cmd(context.root) + zypper_cmd(context),
@@ -58,3 +60,28 @@ def package_manager_scripts(context: Context) -> dict[str, list[PathString]]:
             "apt-sortpkgs",
         )
     }
+
+
+def finalize_package_manager_mounts(context: Context) -> list[PathString]:
+    from mkosi.installer.dnf import dnf_subdir
+
+    mounts: list[PathString] = [
+        *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []),
+        *(["--ro-bind", os.fspath(p), os.fspath(p)] if (p := context.workspace / "apt.conf").exists() else []),
+        *finalize_crypto_mounts(tools=context.config.tools()),
+    ]
+
+    mounts += flatten(
+        ["--bind", d, d]
+        for d in (
+            context.cache_dir / "lib/apt",
+            context.cache_dir / "cache/apt",
+            context.cache_dir / "cache" / dnf_subdir(context),
+            context.cache_dir / "lib" / dnf_subdir(context),
+            context.cache_dir / "cache/pacman/pkg",
+            context.cache_dir / "cache/zypp",
+        )
+        if d.exists()
+    )
+
+    return mounts
index 3ef991cad0486dba59932cf6f64786bda4c019d9..0996039fd66d8771e103a05011932cab20ef2d78 100644 (file)
@@ -3,9 +3,10 @@ import textwrap
 from collections.abc import Sequence
 
 from mkosi.context import Context
+from mkosi.installer import finalize_package_manager_mounts
 from mkosi.mounts import finalize_ephemeral_source_mounts
 from mkosi.run import find_binary, run
-from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
+from mkosi.sandbox import apivfs_cmd
 from mkosi.types import PathString
 from mkosi.util import sort_packages, umask
 
@@ -109,11 +110,7 @@ def invoke_apt(
                     network=True,
                     options=[
                         "--bind", context.root, context.root,
-                        "--bind", context.cache_dir / "lib/apt", context.cache_dir / "lib/apt",
-                        "--bind", context.cache_dir / "cache/apt", context.cache_dir / "cache/apt",
-                        "--ro-bind", context.workspace / "apt.conf", context.workspace / "apt.conf",
-                        *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []),
-                        *finalize_crypto_mounts(tools=context.config.tools()),
+                        *finalize_package_manager_mounts(context),
                         *sources,
                         *mounts,
                         "--chdir", "/work/src",
index 7c7278257ae0d1847eb0fbd4132d8e6435150164..74d743411365d8c8363e686b4d2b15fa484ca0d4 100644 (file)
@@ -4,10 +4,11 @@ from collections.abc import Iterable
 from pathlib import Path
 
 from mkosi.context import Context
+from mkosi.installer import finalize_package_manager_mounts
 from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, setup_rpm
 from mkosi.mounts import finalize_ephemeral_source_mounts
 from mkosi.run import find_binary, run
-from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
+from mkosi.sandbox import apivfs_cmd
 from mkosi.types import PathString
 from mkosi.util import sort_packages
 
@@ -133,14 +134,7 @@ def invoke_dnf(context: Context, command: str, packages: Iterable[str], apivfs:
                     network=True,
                     options=[
                         "--bind", context.root, context.root,
-                        "--bind",
-                        context.cache_dir / "cache" / dnf_subdir(context),
-                        context.cache_dir / "cache" / dnf_subdir(context),
-                        "--bind",
-                        context.cache_dir / "lib" / dnf_subdir(context),
-                        context.cache_dir / "lib" / dnf_subdir(context),
-                        *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []),
-                        *finalize_crypto_mounts(tools=context.config.tools()),
+                        *finalize_package_manager_mounts(context),
                         *sources,
                         "--chdir", "/work/src",
                     ],
index e43d0d0bd8f08181fbb37794d9a73e15ad9b4f24..08fa7e2001d8887f9e4a31dd22667edefd8c8a94 100644 (file)
@@ -4,9 +4,10 @@ from collections.abc import Iterable, Sequence
 from typing import NamedTuple
 
 from mkosi.context import Context
+from mkosi.installer import finalize_package_manager_mounts
 from mkosi.mounts import finalize_ephemeral_source_mounts
 from mkosi.run import run
-from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
+from mkosi.sandbox import apivfs_cmd
 from mkosi.types import PathString
 from mkosi.util import sort_packages, umask
 
@@ -98,9 +99,7 @@ def invoke_pacman(
                     network=True,
                     options=[
                         "--bind", context.root, context.root,
-                        "--bind", context.cache_dir / "cache/pacman/pkg", context.cache_dir / "cache/pacman/pkg",
-                        *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []),
-                        *finalize_crypto_mounts(tools=context.config.tools()),
+                        *finalize_package_manager_mounts(context),
                         *sources,
                         "--chdir", "/work/src",
                     ],
index a710e0e11f0ca5f2f56c64e378ec2eb522cd5471..5af2a697754a4726a4f61e211df5233f7a655100 100644 (file)
@@ -4,10 +4,11 @@ from collections.abc import Sequence
 
 from mkosi.config import yes_no
 from mkosi.context import Context
+from mkosi.installer import finalize_package_manager_mounts
 from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, setup_rpm
 from mkosi.mounts import finalize_ephemeral_source_mounts
 from mkosi.run import run
-from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts
+from mkosi.sandbox import apivfs_cmd
 from mkosi.types import PathString
 from mkosi.util import sort_packages
 
@@ -86,9 +87,7 @@ def invoke_zypper(
                     network=True,
                     options=[
                         "--bind", context.root, context.root,
-                        "--bind", context.cache_dir / "cache/zypp", context.cache_dir / "cache/zypp",
-                        *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []),
-                        *finalize_crypto_mounts(tools=context.config.tools()),
+                        *finalize_package_manager_mounts(context),
                         *sources,
                         "--chdir", "/work/src",
                     ],