files: and the platform writes them into the container before it starts.
app.yaml
A plain file is written exactly as given, so
${...} inside it stays literal.
Limits
Operators set these in the environment:APP_SERVICE_FILE_MAX_BYTES (one file, default 64 KiB), APP_SERVICE_FILES_MAX_TOTAL_BYTES (per service, default 256 KiB) and APP_SERVICE_FILES_MAX (count, default 32).
How it works
The container is created, the files are copied in with the Docker archive API, then it starts. This needs no host path or volume, so it behaves the same on remote nodes (the agent does the copy) and on Podman. A node whose agent predates files refuses the deploy instead of starting the app without its config. The files live in the container layer, so a recreate rewrites them. Files are owned by root: a non-root app needs a mode it can read, such as0444. They are not read-only mounts, and the image’s root filesystem must be writable.
Changing a file changes the service’s applied config, so it shows as a pending change and is applied by a restart. An app.yaml deploy replaces the whole list.
CLI and API
GET, PUT and DELETE /api/v1/apps/{name}/files. Secret files appear with redacted: true and no content. ?apply=restart recreates the app now. Writes need the sensitive write ability.
Templates
A catalog template declares a Compose top-levelconfigs: entry with inline content:. See Starter kit templates.