I'd suggest to first get acquainted with the details of a pip installation (as different from a buildout installation) before you get confused by docker's specifics.
The following is a minimal pip installation of Plone 6 Classic UI which can help to get used with pip's installations:
# install packages
sudo apt-get install -y python3-venv
sudo apt-get install -y git
# set variables
PLONE_VERSION=6.0.2
PLONE_NAME=Plone-${PLONE_VERSION}
PLONE_HOME=${HOME}/${PLONE_NAME}
PLONE_CONSTRAINTS=https://dist.plone.org/release/${PLONE_VERSION}/constraints.txt
PYTHON_TARGET_DIR=/usr/bin
# create venv
${PYTHON_TARGET_DIR}/python3 -m venv "${PLONE_HOME}"
# install pip setuptools and wheel
${PLONE_HOME}/bin/python -m pip install -U pip wheel setuptools -c ${PLONE_CONSTRAINTS}
# install Plone
${PLONE_HOME}/bin/pip --debug install Plone -c ${PLONE_CONSTRAINTS}
# install zope.mkzeoinstance and cookiecutter==2.1.1
${PLONE_HOME}/bin/pip install zope.mkzeoinstance -c ${PLONE_CONSTRAINTS}
${PLONE_HOME}/bin/pip install cookiecutter==2.1.1 -c ${PLONE_CONSTRAINTS}
cd ${PLONE_HOME}
# create zeoinstance with mkzeoinstance
${PLONE_HOME}/bin/mkzeoinstance zeoserver 127.0.0.1:8101
# create zopeinstance (aka client) with cookiecutter using a yaml config file
cat <<EOF | tee ${PLONE_HOME}/client.yaml
default_context:
target: 'client'
wsgi_listen: '*:8081'
initial_user_name: 'admin'
initial_user_password: 'secret'
db_blobs_mode: 'shared'
db_storage: 'zeo'
db_zeo_server: '127.0.0.1:8101'
db_zeo_read_only: false
db_zeo_read_only_fallback: false
db_blobs_location: "blobstorage"
EOF
${PLONE_HOME}/bin/cookiecutter \
-f --no-input \
--config-file "${PLONE_HOME}/client.yaml" \
--checkout 1.0.0b2 https://github.com/plone/cookiecutter-zope-instance
# run zeo in background
${PLONE_HOME}/bin/runzeo -C ${PLONE_HOME}/zeoserver/etc/zeo.conf &
# run wsgi in background
${PLONE_HOME}/bin/runwsgi -v ${PLONE_HOME}/client/etc/zope.ini &
# alternatively run wsgi in debug mode
${PLONE_HOME}/bin/runwsgi -dv ${PLONE_HOME}/client/etc/zope.ini
The directory structures are as follows (The directories under "site-packages" are omitted)
After installing venv, pip, setuptools and wheel the directory structure is as follows:
.
├── bin
├── include
├── lib
│ └── python3.9
│ └── site-packages
│ └── ...
├── lib64 -> lib
└── share
└── python-wheels
After pip installing Plone you get some header files for persistence and zope.proxy and more packages under "site-packages":
.
└── include
└── site
└── python3.9
├── persistent
└── zope.proxy
after create zeoinstance with mkzeoinstance you get a directory called "zeoserver" (this can be defined in when calling "mkzeoinstance")
.
└── zeoserver
├── bin
├── etc
├── log
└── var
after create zope instance with cookiecutter you get the directories "blobstorage" and "client" (the names can be defined in the yaml config-file passed to cookiecutter)
.
├── blobstorage
└── client
├── etc
└── var
├── cache
└── log
The complete final structure is something like:
.
├── bin
├── blobstorage
├── client
│ ├── etc
│ └── var
│ ├── cache
│ └── log
├── include
│ └── site
│ └── python3.9
│ ├── persistent
│ └── zope.proxy
├── lib
│ └── python3.9
│ └── site-packages
│ └── ...
├── lib64 -> lib
├── share
│ └── python-wheels
└── zeoserver
├── bin
├── etc
├── log
└── var
When you compare this strucure with the one in docker (backend) they are similar. The main difference (as @davisagli explained above) are that the directories for zeo, zope, blobstorage, filestorage, log etc. have other names and are placed elsewhere. Here a docker backend directory structure to compare:
.
├── bin
├── etc
│ ├── package-includes
│ └── zope.conf.d
├── include
│ ├── python3.11
│ └── site
│ └── python3.11
│ ├── persistent
│ └── zope.proxy
├── lib
│ └── python3.11
│ └── site-packages
│ └── ...
├── lib64 -> lib [recursive, not followed]
├── scripts
└── var -> /data
├── blobstorage
├── cache
├── filestorage
└── log