x-common: &common # shared values build: &build-base context: . dockerfile: Dockerfile ports: &ports - '3000:3000' healthcheck: &healthcheck # curl outputs to /dev/null to prevent clutter in logs test: ['CMD', 'curl', '-sf', 'http://localhost:3000', '-o', '/dev/null'] interval: 5s timeout: 3s retries: 1 start_period: 3s services: app-dev: build: <<: *build-base target: dev volumes: - ./src:/app/src # enables hot reload - /app/node_modules # keeps installed node_modules ports: *ports healthcheck: *healthcheck app-prod: &app-prod labels: - 'production' build: <<: *build-base target: prod ports: *ports healthcheck: *healthcheck app-test: <<: *app-prod environment: - NODE_ENV=test # override environment variables ports: - '3001:3000' # override ports to prevent conflicts while testing healthcheck: *healthcheck # uses internal port 3000, not host 3001