コンテナーを利用した R 言語の開発

前提条件

R 言語アプリケーションのコンテナー化 を完了していること。

概要

本節ではコンテナー化したアプリケーションに対する開発環境の構築方法を学びます。 ここでは以下を行います。

  • ローカルデータベースを追加して、そのデータを維持します。
  • Compose の設定を通じて、コード編集および保存とともに、実行中の Compose サービスが自動的に更新されるようにします。

サンプルアプリケーションの入手

サンプルアプリケーションを入手するため、新たなリポジトリをクローンすることが必要です。 この中に、データベースに接続するためのロジックが含まれています。

リポジトリのクローンを行うディレクトリに移動して、以下のコマンドを実行します。

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

データベース利用のためのアプリケーション設定

Shiny アプリケーションとローカルデータベースの間の接続を実現するため、Dockerfile 内の COPY 命令を修正する必要があります。

-COPY src/ .
+COPY src_db/ .

ローカルデータベースの追加とデータ維持

コンテナーにおいては、データベースなどのローカルサービスを設定します。 本節では compose.yaml ファイルを修正してデータベースサービスを定義し、データを維持するためのボリュームも定義します。

クローンを行ったリポジトリのディレクトリにある compose.yaml ファイルを IDE またはテキストエディターで開きます。

compose.yaml ファイルでは、データベース設定を行うためのプロパティ記述がコメント化されているので、コメントを解除します。 You must also mount the database password file and set an environment variable on the shiny-app service pointing to the location of the file in the container.

The following is the updated compose.yaml file.

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 ファイルリファレンス を参照してください。

Before you run the application using Compose, notice that this Compose file specifies a password.txt file to hold the database's password. You must create this file as it's not included in the source repository.

In the cloned repository's directory, create a new directory named db and inside that directory create a file named password.txt that contains the password for the database. Using your favorite IDE or text editor, add the following contents to the password.txt file.

mysecretpassword

Save and close the password.txt file.

You should now have the following contents in your r-docker-dev directory.

├── 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

Now, run the following docker compose up command to start your application.

$ docker compose up --build

Now test your DB connection opening a browser at:

http://localhost:3838

以下のようなポップアップメッセージが表示されます。

DB CONNECTED

端末画面から ctrl+c を押下してアプリケーションを停止します。

サービスの自動更新

Use Compose Watch to automatically update your running Compose services as you edit and save your code. For more details about Compose Watch, see Use 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

Run the following command to run your application with Compose Watch.

$ docker compose watch

Now, if you modify your app.R you will see the changes in real time without re-building the image!

端末画面から ctrl+c を押下してアプリケーションを停止します。

まとめ

In this section, you took a look at setting up your Compose file to add a local database and persist data. You also learned how to use Compose Watch to automatically rebuild and run your container when you update your code.

関連情報

次のステップ

In the next section, you'll take a look at how to set up a CI/CD pipeline using GitHub Actions.