使用容器進行 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://: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 管道。