From 9ae698926929476213bbb3b9b4cb836b68856a73 Mon Sep 17 00:00:00 2001
From: ews-pgasser
Date: Mon, 20 Apr 2026 15:34:55 +0200
Subject: [PATCH 1/4] fix: remove nested sites assets volume
---
images/layered/Containerfile | 1 -
1 file changed, 1 deletion(-)
diff --git a/images/layered/Containerfile b/images/layered/Containerfile
index de5e835d..02bf9a20 100644
--- a/images/layered/Containerfile
+++ b/images/layered/Containerfile
@@ -34,7 +34,6 @@ WORKDIR /home/frappe/frappe-bench
VOLUME [ \
"/home/frappe/frappe-bench/sites", \
- "/home/frappe/frappe-bench/sites/assets", \
"/home/frappe/frappe-bench/logs" \
]
From 0cddb6f35becbf9027f67058ef8ffcc74c505321 Mon Sep 17 00:00:00 2001
From: ews-pgasser
Date: Mon, 20 Apr 2026 15:35:36 +0200
Subject: [PATCH 2/4] docs: document volume migration notes for sites/assets
change
---
docs/02-setup/02-build-setup.md | 39 +++++++++++++++++++++------------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/docs/02-setup/02-build-setup.md b/docs/02-setup/02-build-setup.md
index d411cab7..c4404d93 100644
--- a/docs/02-setup/02-build-setup.md
+++ b/docs/02-setup/02-build-setup.md
@@ -74,20 +74,20 @@ podman build \
## Build args
-| Arg | Purpose |
-| -------------------- | --------------------------------------------------------------------------------------------- |
-| **Frappe Framework** | |
-| FRAPPE_PATH | Repository URL for Frappe framework source code. Defaults to https://github.com/frappe/frappe |
-| FRAPPE_BRANCH | Branch to use for Frappe framework. Defaults to version-15 |
-| **Custom Apps** | |
-| (secret) apps_json | Passed via `--secret=id=apps_json,src=apps.json`. Never use `--build-arg` for this file. |
-| **Dependencies** | |
-| PYTHON_VERSION | Python version for the base image |
-| NODE_VERSION | Node.js version |
-| WKHTMLTOPDF_VERSION | wkhtmltopdf version |
-| **bench only** | |
-| DEBIAN_BASE | Debian base version for the bench image, defaults to `bookworm` |
-| WKHTMLTOPDF_DISTRO | use the specified distro for debian package. Default is `bookworm` |
+| Arg | Purpose |
+| -------------------- | ----------------------------------------------------------------------------------------------- |
+| **Frappe Framework** | |
+| FRAPPE_PATH | Repository URL for Frappe framework source code. Defaults to |
+| FRAPPE_BRANCH | Branch to use for Frappe framework. Defaults to version-15 |
+| **Custom Apps** | |
+| (secret) apps_json | Passed via `--secret=id=apps_json,src=apps.json`. Never use `--build-arg` for this file. |
+| **Dependencies** | |
+| PYTHON_VERSION | Python version for the base image |
+| NODE_VERSION | Node.js version |
+| WKHTMLTOPDF_VERSION | wkhtmltopdf version |
+| **bench only** | |
+| DEBIAN_BASE | Debian base version for the bench image, defaults to `bookworm` |
+| WKHTMLTOPDF_DISTRO | use the specified distro for debian package. Default is `bookworm` |
# env file
@@ -130,6 +130,17 @@ This generates `compose.custom.yaml`, which you'll use to start all containers.
> **NOTE**: podman compose is just a wrapper, it uses docker-compose if it is available or podman-compose if not. podman-compose have an issue reading .env files ([Issue](https://github.com/containers/podman-compose/issues/475)) and might create an issue when running the containers.
+# Upgrading from images with a nested sites/assets volume
+
+Previous images declared `VOLUME /home/frappe/frappe-bench/sites/assets` separately. This created an implicit nested mountpoint inside the `sites` volume, which could cause Docker to attach different anonymous volumes per container in multi-container setups.
+That declaration has been removed. `sites` is now the single shared mount, consistent with the compose setup and docs.
+
+**After pulling the updated image:**
+
+- Recreate all containers (`docker compose up --force-recreate`). Without this, Docker may keep the old anonymous `sites/assets` volume
+ attached from before the change.
+- No `bench build` is needed — this only fixes mount consistency, not the asset workflow.
+
---
**Next:** [Start Setup →](03-start-setup.md)
From 63f5169610e483770069061aa99040aeaaa13bce Mon Sep 17 00:00:00 2001
From: ews-pgasser
Date: Mon, 20 Apr 2026 16:30:58 +0200
Subject: [PATCH 3/4] fix: removed sites/assets volume from custom & production
Containerfile too
---
images/custom/Containerfile | 1 -
images/production/Containerfile | 1 -
2 files changed, 2 deletions(-)
diff --git a/images/custom/Containerfile b/images/custom/Containerfile
index c7519e84..e0c5b335 100644
--- a/images/custom/Containerfile
+++ b/images/custom/Containerfile
@@ -144,7 +144,6 @@ WORKDIR /home/frappe/frappe-bench
VOLUME [ \
"/home/frappe/frappe-bench/sites", \
- "/home/frappe/frappe-bench/sites/assets", \
"/home/frappe/frappe-bench/logs" \
]
diff --git a/images/production/Containerfile b/images/production/Containerfile
index 17f1573d..4dfb8685 100644
--- a/images/production/Containerfile
+++ b/images/production/Containerfile
@@ -137,7 +137,6 @@ WORKDIR /home/frappe/frappe-bench
VOLUME [ \
"/home/frappe/frappe-bench/sites", \
- "/home/frappe/frappe-bench/sites/assets", \
"/home/frappe/frappe-bench/logs" \
]
From 17670ec04c34d2666bd82b819a43d8c01c1277f2 Mon Sep 17 00:00:00 2001
From: ews-pgasser
Date: Mon, 20 Apr 2026 17:23:46 +0200
Subject: [PATCH 4/4] docs: move sites/assets volume upgrade note to migration
docs
---
docs/02-setup/02-build-setup.md | 11 -----------
.../06-migration/01-migrate-from-multi-image-setup.md | 11 +++++++++++
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/docs/02-setup/02-build-setup.md b/docs/02-setup/02-build-setup.md
index c4404d93..d0e6907b 100644
--- a/docs/02-setup/02-build-setup.md
+++ b/docs/02-setup/02-build-setup.md
@@ -130,17 +130,6 @@ This generates `compose.custom.yaml`, which you'll use to start all containers.
> **NOTE**: podman compose is just a wrapper, it uses docker-compose if it is available or podman-compose if not. podman-compose have an issue reading .env files ([Issue](https://github.com/containers/podman-compose/issues/475)) and might create an issue when running the containers.
-# Upgrading from images with a nested sites/assets volume
-
-Previous images declared `VOLUME /home/frappe/frappe-bench/sites/assets` separately. This created an implicit nested mountpoint inside the `sites` volume, which could cause Docker to attach different anonymous volumes per container in multi-container setups.
-That declaration has been removed. `sites` is now the single shared mount, consistent with the compose setup and docs.
-
-**After pulling the updated image:**
-
-- Recreate all containers (`docker compose up --force-recreate`). Without this, Docker may keep the old anonymous `sites/assets` volume
- attached from before the change.
-- No `bench build` is needed — this only fixes mount consistency, not the asset workflow.
-
---
**Next:** [Start Setup →](03-start-setup.md)
diff --git a/docs/06-migration/01-migrate-from-multi-image-setup.md b/docs/06-migration/01-migrate-from-multi-image-setup.md
index 0fd2e344..04d8a2c1 100644
--- a/docs/06-migration/01-migrate-from-multi-image-setup.md
+++ b/docs/06-migration/01-migrate-from-multi-image-setup.md
@@ -114,3 +114,14 @@ create-site:
# ... removed for brevity
```
+
+## Upgrading from images with a nested sites/assets volume
+
+Previous images declared `VOLUME /home/frappe/frappe-bench/sites/assets` separately. This created an implicit nested mountpoint inside the `sites` volume, which could cause Docker to attach different anonymous volumes per container in multi-container setups.
+That declaration has been removed. `sites` is now the single shared mount, consistent with the compose setup and docs.
+
+**After pulling the updated image:**
+
+- Recreate all containers (`docker compose up --force-recreate`). Without this, Docker may keep the old anonymous `sites/assets` volume
+ attached from before the change.
+- No `bench build` is needed — this only fixes mount consistency, not the asset workflow.