---
# System prepended metadata

title: Docker 運作過程
tags: [2024 後端工程師 - 資料庫體驗營]

---

# **當你執行 `npm run start` 時的執行流程**

會依序執行以下檔案和步驟：

1. **執行 `npm run start`**
    - 這個命令會在 `package.json` 中尋找對應的腳本：
        
        `"start": "docker compose --env-file .env.example up -d --build"`
        
    - 這行命令會使用 `.env.example` 檔案中的環境變數，啟動並構建 Docker 容器。
2. **讀取 `docker-compose.yml` 檔案**
    - Docker Compose 會根據 `docker-compose.yml` 檔案中的設定，啟動定義的服務。
    - 該檔案中定義了兩個服務：
        - **`postgres` 資料庫容器**
        - **`db_migrate` 資料庫遷移容器**
3. **啟動 `postgres` 資料庫容器**
    - 使用 `postgres:16.4-alpine3.20` 映像，根據環境變數設定資料庫使用者、密碼和資料庫名稱。
    
        
4. **構建並啟動 `db_migrate` 資料庫遷移容器**
    - 根據 `migrate.Dockerfile` 建立容器映像。
    - `depends_on` 確保在 `postgres` 資料庫服務啟動並健康後，才會啟動 `db_migrate` 容器。
5. **執行 `migrate.Dockerfile`**
    - `db_migrate` 容器構建過程中，執行以下步驟：
    - 容器啟動後，會執行 `npm run init`，然後執行 `npm run migrate`。
6. **執行 `npm run init`**
    - 在 `package.json` 中，`init` 腳本定義為：
        
        **"init": "db-migrate up --config database.json -e pg -m ./migrations/init"**
        
    - 這個命令會使用 `db-migrate` 工具，根據 `database.json` 的設定，執行 `./migrations/init` 目錄下的遷移檔案，初始化資料庫結構。
7. **執行 `./migrations/init` 資料夾中的遷移檔案**
    - 這些檔案定義了初始的資料庫結構，例如建立資料表、索引等。
8. **執行 `npm run migrate`**
    - 接著執行 `package.json` 中定義的 `migrate` 腳本：
        
       ` "migrate": "db-migrate up --config database.json -e pg -m ./migrations/task"`
        
    - 這個命令執行 `./migrations/task` 目錄下的遷移檔案，對資料庫進行進一步的變更，例如新增資料、修改結構等。
9. **執行 `./migrations/task` 資料夾中的遷移檔案**
    - 例如，執行 `20241021064214-task.js` 檔案，該檔案會：
        - 讀取並執行 `sqls/20241021064214-task-up.sql` 中的 SQL 指令。
        - 這些 SQL 指令包含了對資料庫的資料插入、更新、刪除等操作。
10. **資料庫更新完成**
    - 經過以上步驟，資料庫已被初始化並更新到最新狀態。
    - 此時，資料庫中已經建立了相應的資料表和資料。
11. **使用 DBeaver 連接資料庫**
    - 因為在 `docker-compose.yml` 中將資料庫的埠 `5432` 映射到本地主機，所以你可以使用 DBeaver 連接到 `localhost:5432`。
    - 使用在 `.env.example` 中設定的使用者名稱和密碼，就能查看到已建立的資料表和資料。

**總結**：當你執行 `npm run start` 時，系統會啟動 Docker 容器，初始化並更新資料庫，最終讓你能夠看到已建好的資料表和資料。


## 將作業上傳到 GitHub ，他做了什麼事情去驗證資料庫指令沒有出錯？

`check.yml` 文件是一個 GitHub Actions 的工作流程配置文件，用於在每次程式碼推送或建立拉取請求時，自動執行資料庫的初始化和遷移測試，確保資料庫遷移腳本的正確性和可靠性。以下是 `check.yml` 所做的事情：

1. **觸發條件**：
    - 當程式被推送（`push`）到任何分支，或建立拉取請求（`pull_request`）時，觸發此工作流程。
2. **定義工作流程**：
    - 工作流程名稱為 **"test-migrate"**。
3. **設定工作環境**：
    - 指定運行環境為 `ubuntu-latest`。
4. **設置環境變數**：
    - 定義資料庫連接所需的環境變數：
        - `DB_USERNAME`: 資料庫使用者名稱（`root`）。
        - `DB_PASSWORD`: 資料庫密碼（`test`）。
        - `DB_DATABASE`: 資料庫名稱（`test`）。
        - `DB_HOST`: 資料庫主機（`localhost`）。
5. **服務配置**：
    - 啟動一個 PostgreSQL 資料庫服務，使用以下配置：
        - **映像**：`postgres:16.4-alpine3.20`。
        - **埠映射**：`5432:5432`，將容器的 5432 埠映射到本地主機。
        - **環境變數**：使用上述設定的資料庫使用者、密碼和資料庫名稱。
6. **執行步驟**：
    - **檢出程式碼庫**：
        - 使用 `actions/checkout@v4` 檢出當前程式碼庫。
    - **設定 Node.js 環境**：
        - 使用 `actions/setup-node@v4`，設定 Node.js 版本為 `22`，並啟用 npm 緩存。
    - **還原 npm 模組緩存**：
        - 使用緩存來加速依賴安裝過程。
    - **安裝依賴**：
        - 執行 `npm ci --production` 安裝生產環境所需的依賴。
    - **更新 npm 模組緩存**：
        - 將新的依賴緩存起來，供未來的工作流程使用。
    - **執行資料庫遷移測試**：
        - 執行 `npm run init && npm run migrate`，初始化並遷移資料庫。
        - 這會執行位於 `./migrations/init` 和 `./migrations/task` 資料夾中的遷移腳本，確保資料庫結構與最新的程式碼一致。
7. **目的和作用**：
    - 自動化資料庫遷移測試，確保每次程式碼變更都不會破壞資料庫的完整性。
    - 提早發現潛在的資料庫遷移問題，提升程式碼品質。
    - 確保團隊成員在合併程式碼前，資料庫遷移腳本能夠在乾淨的環境下成功執行。

透過 `check.yml`，每當有新的程式碼提交或拉取請求時，GitHub Actions 會自動測試資料庫遷移，確保應用程式的穩定性和可靠性。

