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