This guide describes the validated installer-cache workflow for deploying the setup version selected in setup-versions.yml inside a Shotwright container.
Shotwright supports two runtime modes:
- Host mount — mount the host-side After Effects install that matches the version selected in
setup-versions.ymlinto the container. - Installer-cache mode — pull the prepared setup image from GHCR first, or build the cache locally as a fallback, then let Shotwright install After Effects automatically at startup.
This document focuses on installer-cache mode.
Resolve the active setup version from setup-versions.yml first:
$setup = python .\scripts\install\setup_versions.py | ConvertFrom-JsonThis object also includes $setup.install_root, the AE install directory expected for the selected version.
Cross-environment defaults such as host payload roots, runner temp subdirectory names, container mount roots, and base image tags are centralized in shotwright-config.json.
The recommended approach is to pull the pre-built installer payload image from GHCR:
docker pull $setup.ghcr_image
docker create --name ae-setup $setup.ghcr_image cmd /c exit
docker cp 'ae-setup:C:\payload' 'C:\data\payload'
docker rm ae-setupIf the image is too large for a reliable docker pull, use scripts/pull_container_image.py instead. It downloads through http_proxy or https_proxy, writes a docker archive to disk, and can load it locally:
python .\scripts\pull_container_image.py --image $setup.ghcr_image --output-dir C:\data\images --loadAfter extraction you should have:
| Directory | Required contents |
|---|---|
C:\data\payload\<payload_dir_name> |
driver.xml and all AE package folders |
C:\data\payload\<helper_dir_name> |
HDBox (with patched Setup.exe) and IPC directories |
Alternative: build the installer cache from scratch
If you need to build the installer cache locally instead of pulling from GHCR:
python scripts\install\download_after_effects_payload.py --payload-root C:\data\payloadThat script relies on scripts/install/download_utils.py and the helper classes used to resolve Adobe packages and supporting downloads.
Before first use, patch the helper installer:
$helperSetup = Join-Path (Join-Path 'C:\data\payload' $setup.helper_dir_name) 'HDBox\Setup.exe'
python scripts\install\modify_setup_win.py $helperSetupIf the file has already been patched, the script reports Setup.exe appears to be already patched. and exits successfully.
- Docker Desktop is running in Windows container mode.
docker info --format '{{.OSType}}'should returnwindows. - You have already built, or are ready to build, a local Shotwright image.
docker build -t shotwright:runtime .The Dockerfile now builds the all-in-one shotwright:runtime image. It copies the published After Effects setup payload from GHCR into the image and runs the installer during image build, so service-created worker containers do not depend on runtime payload mounts.
Use scripts/validate/run_validation.ps1:
powershell -ExecutionPolicy Bypass -File .\scripts\validate\run_validation.ps1 `
-ImageTag shotwright:runtime `
-AfterEffectsPayloadRoot (Join-Path 'C:\data\payload' $setup.payload_dir_name) `
-CreativeCloudHelperRoot (Join-Path 'C:\data\payload' $setup.helper_dir_name)This command does the following:
- Starts a Windows container from the specified image.
- Mounts the repository, validation data directory, AE installer cache, and Creative Cloud helper cache.
- Lets
scripts/runtime_entrypoint.ps1invokescripts/install/install_after_effects_in_container.ps1. - Waits for
aerender.exeto appear and report a version. - Generates
validation_motion.aep. - Runs nexrender and ensures
validation.mp4ends up invalidation-data/output.
Expected result:
validation-data\output\validation.mp4
After Effects sometimes returns a non-zero exit code even when the render completed successfully. When that happens, scripts/validate/run_validation.ps1 recovers the newest result.mp4 from validation-data/work.
This usually means the driver.xml path was split by spaces. Use space-free paths such as C:\data\payload\<payload_dir_name>.
This message is non-fatal. The installer is reusing a temporary extraction directory and can continue.
- The install completes without
Adobe Setup is not Authorized. $setup.install_root\Support Files\aerender.exeexists inside the container.aerender -versionprints a valid version string.validation.mp4is produced undervalidation-data/output.