Mount(json, "/work/config.json", ro=True),
                             Mount(context.root, "/buildroot"),
                             Mount(context.artifacts, "/work/artifacts"),
-                            Mount(context.packages, "/work/packages"),
+                            Mount(context.package_dir, "/work/packages"),
                             *(
                                 [Mount(context.config.build_dir, "/work/build", ro=True)]
                                 if context.config.build_dir
                             Mount(context.install_dir, "/work/dest"),
                             Mount(context.staging, "/work/out"),
                             Mount(context.artifacts, "/work/artifacts"),
-                            Mount(context.packages, "/work/packages"),
+                            Mount(context.package_dir, "/work/packages"),
                             *(
                                 [Mount(context.config.build_dir, "/work/build")]
                                 if context.config.build_dir
                             Mount(context.root, "/buildroot"),
                             Mount(context.staging, "/work/out"),
                             Mount(context.artifacts, "/work/artifacts"),
-                            Mount(context.packages, "/work/packages"),
+                            Mount(context.package_dir, "/work/packages"),
                             *(
                                 [Mount(context.config.build_dir, "/work/build", ro=True)]
                                 if context.config.build_dir
                             Mount(context.root, "/buildroot"),
                             Mount(context.staging, "/work/out"),
                             Mount(context.artifacts, "/work/artifacts"),
-                            Mount(context.packages, "/work/packages"),
+                            Mount(context.package_dir, "/work/packages"),
                             *(
                                 [Mount(context.config.build_dir, "/work/build", ro=True)]
                                 if context.config.build_dir
     *,
     resources: Path,
     output_dir: Optional[Path] = None,
-    package_dir: Optional[Path] = None,
 ) -> Config:
     if config.root_password:
         password, hashed = config.root_password
         *(f"--volatile-package={package}" for package in config.initrd_volatile_packages),
         *(f"--package-directory={d}" for d in config.package_directories),
         *(f"--volatile-package-directory={d}" for d in config.volatile_package_directories),
-        *([f"--volatile-package-directory={package_dir}"] if package_dir else []),
         "--output", "initrd",
         *(["--image-id", config.image_id] if config.image_id else []),
         *(["--image-version", config.image_version] if config.image_version else []),
         context.config,
         resources=context.resources,
         output_dir=context.workspace,
-        package_dir=context.packages,
     )
 
     assert config.output_dir
                 resources=context.resources,
                 # Re-use the repository metadata snapshot from the main image for the initrd.
                 package_cache_dir=context.package_cache_dir,
+                package_dir=context.package_dir,
             )
         )
 
 
         with createrepo(context):
             install_package_directories(context, context.config.volatile_package_directories)
-            install_package_directories(context, [context.packages])
+            install_package_directories(context, [context.package_dir])
 
         install_volatile_packages(context)
         install_build_dest(context)
         run_sync_scripts(context)
 
 
-def run_build(args: Args, config: Config, *, resources: Path) -> None:
+def run_build(args: Args, config: Config, *, resources: Path, package_dir: Optional[Path] = None) -> None:
     if (uid := os.getuid()) != 0:
         become_root()
     unshare(CLONE_NEWNS)
             rchown_package_manager_dirs(config),
             setup_workspace(args, config) as workspace,
         ):
-            build_image(Context(args, config, workspace=workspace, resources=resources))
+            build_image(Context(args, config, workspace=workspace, resources=resources, package_dir=package_dir))
 
 
 def run_verb(args: Args, images: Sequence[Config], *, resources: Path) -> None:
 
     build = False
 
-    for i, config in enumerate(images):
-        images[i] = config = dataclasses.replace(
-            config,
-            tools_tree=(
-                tools.output_dir_or_cwd() / tools.output
-                if tools and config.tools_tree == Path("default")
-                else config.tools_tree
+    with tempfile.TemporaryDirectory(dir=last.workspace_dir_or_default(), prefix="mkosi-packages-") as package_dir:
+        for i, config in enumerate(images):
+            images[i] = config = dataclasses.replace(
+                config,
+                tools_tree=(
+                    tools.output_dir_or_cwd() / tools.output
+                    if tools and config.tools_tree == Path("default")
+                    else config.tools_tree
+                )
             )
-        )
 
-        images[i] = config = run_configure_scripts(config)
+            images[i] = config = run_configure_scripts(config)
 
-        if args.verb != Verb.build and args.force == 0:
-            continue
+            if args.verb != Verb.build and args.force == 0:
+                continue
 
-        if (
-            config.output_format != OutputFormat.none and
-            (config.output_dir_or_cwd() / config.output_with_compression).exists()
-        ):
-            continue
+            if (
+                config.output_format != OutputFormat.none and
+                (config.output_dir_or_cwd() / config.output_with_compression).exists()
+            ):
+                continue
 
-        check_inputs(config)
-        fork_and_wait(run_sync, args, config, resources=resources)
-        fork_and_wait(run_build, args, config, resources=resources)
+            check_inputs(config)
+            fork_and_wait(run_sync, args, config, resources=resources)
+            fork_and_wait(run_build, args, config, resources=resources, package_dir=Path(package_dir))
 
-        build = True
+            build = True
 
     if build and args.auto_bump:
         bump_image_version()