使用容器進行 R 開發

先決條件

完成 將 R 應用程式容器化

概觀

在本節中,您將學習如何為您的容器化應用程式設定開發環境。 這包括

  • 新增本地資料庫並保存資料
  • 設定 Compose 以在您編輯和儲存程式碼時自動更新正在執行的 Compose 服務

取得範例應用程式

您需要複製一個新的儲存庫才能取得包含連接到資料庫邏輯的範例應用程式。

切換到您要複製儲存庫的目錄並執行以下命令。

$ git clone https://github.com/mfranzon/r-docker-dev.git

設定應用程式以使用資料庫

要嘗試 Shiny 應用程式與本地資料庫之間的連線,您必須修改 `Dockerfile` 並更改 `COPY` 指令

-COPY src/ .
+COPY src_db/ .

新增本地資料庫並保存資料

您可以使用容器來設定本地服務,例如資料庫。 在本節中,您將更新 `compose.yaml` 檔案以定義資料庫服務和保存資料的磁碟區。

在複製的儲存庫目錄中,使用 IDE 或文字編輯器開啟 `compose.yaml` 檔案。

在 `compose.yaml` 檔案中,您需要取消註釋用於設定資料庫的屬性。 您還必須掛載資料庫密碼檔案,並在 `shiny-app` 服務上設定一個環境變數,指向容器中檔案的位置。

以下是更新後的 `compose.yaml` 檔案。

services:
  shiny-app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 3838:3838
    environment:
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    depends_on:
      db:
        condition: service_healthy
    secrets:
      - db-password
  db:
    image: postgres
    restart: always
    user: postgres
    secrets:
      - db-password
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=example
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    expose:
      - 5432
    healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  db-data:
secrets:
  db-password:
    file: db/password.txt

**注意**

要瞭解更多關於 Compose 檔案中的指令,請參閱 Compose 檔案參考

在您使用 Compose 執行應用程式之前,請注意此 Compose 檔案指定了一個 `password.txt` 檔案來存放資料庫的密碼。 您必須建立此檔案,因為它不包含在原始碼儲存庫中。

在複製的儲存庫目錄中,建立一個名為 `db` 的新目錄,並在該目錄內建立一個名為 `password.txt` 的檔案,其中包含資料庫的密碼。 使用您慣用的 IDE 或文字編輯器,將以下內容新增到 `password.txt` 檔案中。

mysecretpassword

儲存並關閉 `password.txt` 檔案。

您現在應該在 `r-docker-dev` 目錄中有以下內容。

├── r-docker-dev/
│ ├── db/
│ │ └── password.txt
│ ├── src/
│ │ └── app.R
│ ├── src_db/
│ │ └── app_db.R
│ ├── requirements.txt
│ ├── .dockerignore
│ ├── compose.yaml
│ ├── Dockerfile
│ ├── README.Docker.md
│ └── README.md

現在,執行以下 `docker compose up` 命令來啟動您的應用程式。

$ docker compose up --build

現在,在以下網址開啟瀏覽器來測試您的資料庫連線

https://127.0.0.1:3838

您應該會看到一個彈出訊息

DB CONNECTED

在終端機中按下 `ctrl+c` 以停止您的應用程式。

自動更新服務

使用 Compose Watch 在您編輯和儲存程式碼時自動更新正在執行的 Compose 服務。 有關 Compose Watch 的更多詳細資訊,請參閱 使用 Compose Watch

`compose.yaml` 檔案中的第 15 到 18 行包含觸發 Docker 在目前工作目錄中的檔案變更時重建映像檔的屬性

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
services:
  shiny-app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 3838:3838
    environment:
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    depends_on:
      db:
        condition: service_healthy
    secrets:
      - db-password
    develop:
      watch:
        - action: rebuild
          path: .
  db:
    image: postgres
    restart: always
    user: postgres
    secrets:
      - db-password
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=example
      - POSTGRES_PASSWORD_FILE=/run/secrets/db-password
    expose:
      - 5432
    healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  db-data:
secrets:
  db-password:
    file: db/password.txt

執行以下命令以使用 Compose Watch 執行您的應用程式。

$ docker compose watch

現在,如果您修改 `app.R`,您將會即時看到變更,而無需重新建置映像檔!

在終端機中按下 `ctrl+c` 以停止您的應用程式。

摘要

在本節中,您瞭解了如何設定 Compose 檔案以新增本地資料庫並保存資料。 您還學習了如何使用 Compose Watch 在更新程式碼時自動重建和執行您的容器。

相關資訊

後續步驟

在下一節中,您將瞭解如何使用 GitHub Actions 設定 CI/CD 流程。