It contains unique copies of your sites themes, which include JS, CSS and other types of assets.
Also the unique combination of your plugins and their dependencies.
It’s a long history, but Discourse and most of the tooling predates stuff like Docker compose.
We ship a fat container that contains the whole kitchen sink, and there are several trade-offs to that. As for one, the stateful container allows for features like our web based one-click updater.
Coming from a more modern approach to how containers are usually deployed today, it is indeed a big discrepancy. This is discussed at long in Can Discourse ship frequent Docker images that do not need to be bootstrapped? and is worth a read.
In the end, our current status quo works well for people who are only slightly tech-inclined, that can copy and paste commands in a SSH session and configure DNS, but aren’t masters of Linux containers.
And as for the Linux containers black-belts out there, we can tell then that they can take that bootstrapped image, ship it to a registry and re-use it on their favorite container orchestration software.
People between the two personas above tho, they feel the pain the most.