Add the front end's port to .env, delete the old volume for a true first run, and start everything: --build builds both images and --wait returns only when every service is healthy.
echo WEB_PORT=33080 >> .env
docker compose down -v >/dev/null 2>&1
SECONDS=0; docker compose up -d --build --wait 2>&1 | grep -E 'Built|Healthy' \
| awk '!seen[$0]++'; echo "${SECONDS}s"
docker compose logs --no-log-prefix db | grep -E 'initdb.d|CREATE DATABASE'
docker compose exec db psql -U booknest -tAc 'SELECT count(*) FROM books'Output
Image l3-booknest-api Built Image l3-booknest-web Built Container l3-booknest-db-1 Healthy Container l3-booknest-api-1 Healthy Container l3-booknest-web-1 Healthy 17s CREATE DATABASE /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/* 6
Compose 514 built both images and waited for each healthcheck in dependency order. The log shows a first initialization with no init scripts, and the API seeded six books. The time is from a shared 4-CPU machine with warm caches; a clean machine first pulls the base images.