Docker Compose 一個檔案起整套環境

docker run 已經長到六七行、而且要照順序開三個容器時,就該換 Compose。它把所有 run 參數寫成一個 YAML。

services:
  api:
    build: .
    ports: ["3000:3000"]
    environment:
      DB_HOST: postgres          # 服務名稱直接當 hostname
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped
 
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: dev123
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 5
    # 不開 ports,只有內網連得到 → 更安全
 
volumes:
  pgdata:
docker compose up -d --build    # 重建再啟動
docker compose logs -f api
docker compose down             # 停掉並移除(加 -v 連 volume 一起刪,資料會沒)

它自動幫你做的事

⚠️ depends_on 不保證「就緒」

它預設只保證啟動順序。Postgres 容器啟動了不代表它已經可以接受連線。要搭配 healthcheck + condition: service_healthy,或在應用程式端做連線重試——正式環境建議兩者都做。

這是「新人第一天上班」問題的最終解

README 從 30 個步驟變成 git clonecddocker compose up。而且 docker-compose.yml 進了 git,環境的每次變更都有版本紀錄、都能 code review

開發用疊加檔(掛原始碼 + 覆寫 CMD 跑 nodemon):docker compose -f docker-compose.yml -f docker-compose.dev.yml up,注意 bind mount 掛原始碼會蓋掉 image 裡的 node_modules