chore(docker): add development environment with hot reload

Add dev stage to Dockerfile and startup script
Create docker-compose.dev.yml for local development
Update README with Docker dev mode instructions
This commit is contained in:
2026-04-12 21:54:58 +08:00
parent 8541c4a2d1
commit 7f582b530c
4 changed files with 69 additions and 0 deletions

7
.docker/dev-start.sh Normal file
View File

@@ -0,0 +1,7 @@
#!/bin/sh
set -eu
pnpm install --frozen-lockfile
exec pnpm dev --host "${HOST:-0.0.0.0}" --port "${PORT:-20013}"

View File

@@ -12,6 +12,13 @@ FROM deps AS build
COPY . . COPY . .
RUN pnpm build RUN pnpm build
FROM deps AS dev
ENV NODE_ENV=development
COPY .docker/dev-start.sh /usr/local/bin/docker-dev-start
RUN chmod +x /usr/local/bin/docker-dev-start
EXPOSE 20013
CMD ["docker-dev-start"]
FROM base AS prod-deps FROM base AS prod-deps
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
RUN pnpm install --frozen-lockfile --prod RUN pnpm install --frozen-lockfile --prod

View File

@@ -65,6 +65,7 @@ The repo now includes a production-ready container stack:
- [Dockerfile](/mnt/d/SourceCode/tootaio/dinner-ticket-system/Dockerfile) - [Dockerfile](/mnt/d/SourceCode/tootaio/dinner-ticket-system/Dockerfile)
- [docker-compose.yml](/mnt/d/SourceCode/tootaio/dinner-ticket-system/docker-compose.yml) - [docker-compose.yml](/mnt/d/SourceCode/tootaio/dinner-ticket-system/docker-compose.yml)
- [docker-compose.dev.yml](/mnt/d/SourceCode/tootaio/dinner-ticket-system/docker-compose.dev.yml)
- [.dockerignore](/mnt/d/SourceCode/tootaio/dinner-ticket-system/.dockerignore) - [.dockerignore](/mnt/d/SourceCode/tootaio/dinner-ticket-system/.dockerignore)
Bring up the full environment: Bring up the full environment:
@@ -97,6 +98,29 @@ docker compose down -v
For passkey testing in Docker, set `NUXT_PUBLIC_APP_URL` to the exact origin you open in the browser. In production, this should be your final HTTPS URL. For passkey testing in Docker, set `NUXT_PUBLIC_APP_URL` to the exact origin you open in the browser. In production, this should be your final HTTPS URL.
### Docker Development With Hot Reload
Use the dev override when you want live reload instead of rebuilding the image after every code change:
```bash
docker compose -f docker-compose.yml -f docker-compose.dev.yml up --build
```
This keeps PostgreSQL and Redis in Docker, but runs the app container in Nuxt dev mode with:
- the project directory bind-mounted into `/app`
- a persistent `/app/node_modules` volume so dependencies stay inside Docker
- an automatic `pnpm install --frozen-lockfile` during app container startup
- polling-based file watching for reliable reloads on mounted filesystems
After the first start, code changes on the host should reload automatically without rebuilding the image.
When you change dependencies, restart the app container so it reruns `pnpm install` against the current lockfile:
```bash
docker compose -f docker-compose.yml -f docker-compose.dev.yml restart app
```
## Protected Areas ## Protected Areas
- `/login` - `/login`

31
docker-compose.dev.yml Normal file
View File

@@ -0,0 +1,31 @@
services:
app:
build:
context: .
dockerfile: Dockerfile
target: dev
environment:
NODE_ENV: development
HOST: 0.0.0.0
NITRO_HOST: 0.0.0.0
PORT: 20013
CHOKIDAR_USEPOLLING: "true"
CHOKIDAR_INTERVAL: ${CHOKIDAR_INTERVAL:-1000}
WATCHPACK_POLLING: "true"
NUXT_DATABASE_URL: ${NUXT_DATABASE_URL:-postgresql://postgres:postgres@postgres:5432/dinner_ticket_system}
NUXT_REDIS_URL: ${NUXT_REDIS_URL:-redis://redis:6379}
NUXT_SESSION_COOKIE_NAME: ${NUXT_SESSION_COOKIE_NAME:-dinner_ticket_session}
NUXT_PUBLIC_APP_URL: ${NUXT_PUBLIC_APP_URL:-http://localhost:20013}
NUXT_PUBLIC_RP_NAME: ${NUXT_PUBLIC_RP_NAME:-Dinner Ticket System}
volumes:
- .:/app
- app_node_modules:/app/node_modules
- app_nuxt:/app/.nuxt
healthcheck:
start_period: 60s
tty: true
stdin_open: true
volumes:
app_node_modules:
app_nuxt: