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