/* terashim.com */

システム開発・データエンジニアリング・データ分析についての個人的なノート

Docker による ローカル RStudio Server プロジェクト の GitHub テンプレートとトラブルシューティングガイド

概要

GitHub で Rプロジェクトを作成するためのテンプレートリポジトリを作成しました。 これには Docker Compose でローカル RStudio Server 環境を起動するための設定が含まれています。

このテンプレートリポジトリは https://github.com/terashim/rstudio-docker-project-template で公開されています。

以下ではこのテンプレートの構成について解説し、Docker 運用上のトラブルシューティングついても簡単にまとめます。

特にまだ Docker を利用したことがない R ユーザーの方にとって導入の助けになれば嬉しく思います。


目次


使い方

ローカルマシンには Docker と Docker Compose がインストールされているものとします。 この GitHub テンプレートリポジトリ を元に GitHub リポジトリを作成し、それをローカルにクローンして docker-compose up でコンテナを起動します。 コンテナが起動すると http://localhost:8787 で RStudio Server に接続できるようになります。 詳しくはこのリポジトリの README ファイルをご覧ください。

"Use this template" ボタンから GitHub テンプレートを使用する

"Use this template" ボタンから GitHub テンプレートを使用する


ファイル構成

リポジトリは主にこのようなファイル構成になっています

.
├── .gitignore
├── _rstudio/
│   └── Dockerfile
├── docker-compose.yml
├── example.R
└── project.Rproj

特徴として

  • このGitリポジトリが1つの R プロジェクト になっています。
  • Docker で RStudio Server を起動して使うのが推奨ですが、デスクトップ版 RStudio でもそのままプロジェクトを開くことができます。
  • プロジェクト内(_rstudio/ フォルダ)に Docker イメージのビルド用ファイルが含まれています。
  • ローカルで RStudio Server のコンテナを起動するための設定が docker-compose.yml ファイルで管理されています。

Docker Compose によるコンテナ起動時設定

イメージのビルドやコンテナ起動の設定は docker-compose.yml に記述されます。

docker-compose up コマンドで起動すると

  • _rstudio でイメージ your-poject-name:latest をビルド
  • ビルドされたイメージ your-poject-name:latest からコンテナを起動
  • プロジェクトのファイルはコンテナの /home/rstudio/project にマウントされる

という設定になっています。


rocker イメージ利用の工夫

このテンプレートでは rocker イメージ の利用にあたって次のような工夫をしています。

(1) プロジェクトごとにイメージをビルドする

プロジェクトごとにベースイメージを変更する・必要なパッケージをインストールするなどして専用の Docker イメージを作成する運用を想定しています。

イメージをビルドするためのファイルは _rstudio/ フォルダにまとめられています。

_rstudio/Dockerfile を編集して

FROM 命令

FROM rocker/tidyverse:4.0.2

FROM rocker/rstudio:3.6.3-ubuntu18.04

に変えればベースイメージが rocker/rstudio:3.6.3-ubuntu18.04 になります。

RUN 命令

RUN install2.r パッケージ名

を加えれば、そのパッケージをインストールしたイメージがビルドされます。

ビルド実行時の設定は docker-compose.yml のこの部分に記述されています:

services:
  rstudio:
    image: your-project-name:latest
    build:
      context: _rstudio

ビルドされるイメージの名前 your-project-name:latest はプロジェクトに合わせて変更する想定になっています。

なお、プロジェクトごとにイメージをビルドするとファイル容量が心配になるかもしれませんが、 Docker は他の仮想マシンと違いイメージ間で共通のレイヤを共有するので、差分の小さなイメージを多数作ってもそれほどストレージ容量を圧迫するわけではありません。

(2) RStudio Server のユーザー認証を無効化する

コンテナの起動時に環境変数 DISABLE_AUTH の値を true に設定しておくと、RStudio Server に接続したときパスワード入力なしでセッションを開始できます。

この設定はローカル環境で RStudio Server を利用する場合に便利です。 安全のため、パブリックにアクセスできる環境で RStudio Server を起動する際には認証を無効化しないよう注意してください。

このテンプレートリポジトリでは設定ファイル docker-compose.yml で環境変数 DISABLE_AUTH を指定しているので、 docker-compose up コマンドで起動したときにこの設定が自動で反映されます。

(3) スペルチェックを無効化する

RStudio バージョン 1.3 ではデフォルトでスペルチェックが有効になっています (RStudio 1.3 Preview: Real Time Spellchecking | RStudio Blog)。 しかし、RStudio に元から入っているスペルチェック用辞書は日本語に対応しておらず、日本語で利用していると警告が多数出てしまいます。

日本語で利用する場合はスペルチェックを無効化しておくと良いでしょう。 GUI 操作では、 Tools > Global Options > Spelling から Use real time spellchecking のチェックを外すことで無効化できます。

しかし、GUIでグローバルオプションを変更しても一度コンテナを停止して再起動するとまた元に戻ってしまいます。 コンテナを再起動するたびに設定変更の作業を行うのは面倒です。

グローバルオプションが変更された状態のイメージを作成できればこの問題は解決します。 RStudio バージョン 1.3 ではグローバルオプションをJSONファイルで管理できるようになっていたので、これを利用してイメージをビルドすることにしました(RStudio 1.3 Preview: Configuration and Settings | RStudio Blog)。

グローバルオプションの設定内容は /home/rstudio/.config/rstudio/rstudio-prefs.json ファイルに保存されます。 ビルドの際にこのファイルを上書きすれば設定変更済みのイメージを利用できるようになります。

このテンプレートリポジトリ中にはグローバルオプションの設定ファイル _rstudio/.config/rstudio/rstudio-prefs.json が用意してあります:

{
    "reuse_sessions_for_project_links": true,
    "panes": {
        "quadrants": [
            "Source",
            "Console",
            "TabSet1",
            "TabSet2"
        ],
        ... (中略) ...
    },
    "real_time_spellchecking": false,
    "posix_terminal_shell": "bash",
    "show_hidden_files": true,
    "restore_source_documents": false,
    "save_workspace": "never",
    "load_workspace": false,
    "restore_last_project": false
}

スペルチェックの無効化は "real_time_spellchecking": false の行で指定されています。

そして、イメージのビルド時に _rstudio/DockerfileCOPY 命令でこのファイルをコンテナ内にコピーしています:

COCOPY --chown=rstudio:rstudio .config/rstudio/rstudio-prefs.json /home/rstudio/.config/rstudio/rstudio-prefs.json

Global Options を好みの設定にするには

上の方法を使うと、スペルチェックの他にも好みの設定でイメージをビルドすることができます。

JSONファイルの書き方を知らなくても、RStudio Server を起動して GUI で Global Options を変更すればその内容が /home/rstudio/.config/rstudio/rstudio-prefs.json に上書きされるので、それを使えばOKです。 コンテナ内にある(マウントされていない)このJSONファイルの内容を表示するには、次のコマンドを実行します

docker-compose exec rstudio cat /home/rstudio/.config/rstudio/rstudio-prefs.json

その内容を _rstudio/.config/rstudio/rstudio-prefs.json に書き込んでイメージをビルドすれば、設定済みのイメージが出来上がります。


Docker トラブルシューティング

Docker を実務で利用していくには、正常に動作している場合の操作を覚えるだけでなく、異常が発生した際に問題解決できる必要があります。以下に一般的なトラブルシューティングの方法を挙げておきます。

一般的な状態確認系コマンド

Docker Compose で起動中のコンテナについて調べるには、コンテナの一覧を表示するコマンド docker-compose ps やログ表示コマンド docker-compose logs を利用します。

特定のプロジェクトだけでなくマシン上のすべてのコンテナを表示するには docker ps -a コマンドを使用します。

コンテナ以外のリソースについては

  • Docker ネットワークの一覧を表示するコマンド docker network ls
  • Docker ボリュームの一覧を表示するコマンド docker volume ls
  • Docker イメージの一覧を表示するコマンド docker image ls

で確認します。

起動したコンテナが勝手に停止してしまう場合、その原因を調べるには docker ps -a で停止したコンテナのIDを調べ、docker inspect コンテナID で詳細情報を表示します。

また、最近の Docker Desktop ではGUIの ダッシュボード でコンテナの状態確認ができるようになっていて非常に便利です。こちらも併せて利用すると良いですよう。

コンテナに "ログイン" したい

起動しているコンテナの内部を調べるために "ログイン" したい場合があります。

コンテナはサーバではないので SSH 接続でログインすることはできませんが、 docker exec コマンドを利用して

docker exec -it コンテナ名 bash

docker exec -it コンテナ名 /bin/sh

などとすることで対話的なシェルを開始することができます。 すると SSH でログインしたのと同じような感覚でコマンド操作することができます。

Docker Compose を使っているときは

docker-compose exec サービス名 bash

とすることもできます。 この GitHub テンプレートリポジトリ ではサービス名を rstudio としています。

なぜか docker-compose up で起動できない

コンテナを起動しようとしてエラーになる場合は、まず エラーメッセージをよく読みます 。そして

  • Docker Desktop が起動していないなら、起動する。
  • docker-compose.yml バージョン 3 に対応していないなら、Docker Desktop のバージョンを上げる。
  • ビルドエラーなら Dockerfile の内容を確認する。
  • ポートの衝突なら、他のプロジェクトで docker-compose up が起動中かどうか確認する。起動中なら docker-compose down で停止する。

などの対応を取ります。

また、ビルドや起動などの操作をやり直す際にシステムを一度きれいな状態に戻すには

docker system prune

が便利です。 これは使用していないネットワークや停止したコンテナなどの余計なリソースを削除するコマンドです。

コンテナを停止するとファイルが消えてしまう

コンテナ内のフォルダ /home/rstudio/your-poject-name はホスト(=ローカルマシン)にマウントされますが、それ以外の場所にあるファイルはマウントされません。 マウントされていないファイルは docker-compose down でコンテナを停止・削除するとともに消えてしまいます。

作成したファイルは基本的にプロジェクト /home/rstudio/your-poject-name 内に保存するのが良いでしょう。 他のフォルダを使いたい場合は、そのフォルダをマウントするように設定ファイル docker-compose.ymlvolume の設定を変更します。

RStudioのオプション設定を変更しても元に戻ってしまう

プロジェクトオプション (Tools > Project Options) の設定内容はマウントされている .Rproj ファイルに残りますが、グローバルオプション (Tools > Global Options) の内容はマウントされていないファイル /home/rstudio/.config/rstudio/rstudio-prefs.json に保存されるので、コンテナを再起動すると元に戻ってしまいます。 変更内容を固定するには上記 Global Options を好みの設定にするには をご覧ください。

Dockerfile の変更が反映されない

Dockerfile を書き換えてから docker-compose up コマンドで RStudio Server を起動しても、 既にビルド済みのイメージがある場合にはそれが再利用されるので変更が反映されません。

Dockerfile の変更を反映するには

docker-compose build

でイメージを再ビルドし、

docker-compose restart

でコンテナを起動し直します。

Dockerfile 以外のビルド用ファイルを変更した場合も同様です。

Dockerイメージがストレージ容量を圧迫する

Dockerイメージ間では同じレイヤーが共有されるので、イメージを複数作っても使用する容量がそのまま増えるわけではありません。 しかし、異なるバージョンの rocker イメージを多数 pull していたり、重いパッケージを入れたイメージを多数ビルドしたりしていると、保存されたイメージがストレージ容量を圧迫してしまうこともあるかもしれません。

そのような場合には使用していない古いイメージを削除します。

ローカルマシンに保存されているイメージを確認するには

docker image ls

を実行します。

Docker Compose でビルドされたイメージを削除したい場合は、そのプロジェクトのフォルダに移動して

docker-compose down --rmi all

を実行します。

直接イメージを指定して削除するには

docker image rm イメージID

を実行します。

もし削除するイメージをどこかにアーカイブしておきたい場合は、Docker レジストリ に push します。 Docker レジストリとしては Docker Hub のほか様々なクラウドサービスがありますが、個人的には Google Container Registry がおすすめです。普段 AWS や Azure を利用しているなら Amazon ECRAzure Container Registry も良い選択肢だと思います。

同じようにイメージをビルドしているのに結果が再現しない

_rstudio/Dockerfile やその他のファイルが全く同一でも、ビルドを実行する環境や時期によって作成されるイメージは異なる可能性があります。

原因としてはベースイメージの更新やインストールするパッケージのバージョンアップなどが考えられます。 タグではなく digest 値でベースイメージを指定する、バージョンを指定してパッケージをインストールするなどで安定性を高めることができます。

最も確実に再現性を担保する方法はビルド済みのイメージを共有することです。 イメージの共有には Docker レジストリを利用します。 詳しくは Docker Hub QuickstartGoogle Container Registry のドキュメント などを参考にしてください。


フィードバック

このテンプレートリポジトリ https://github.com/terashim/rstudio-docker-project-template は MIT ライセンスで公開していますので、特に許可なく誰でも自由に利用できます。

不具合の報告や改善のご意見等は GitHub の Issue 、この投稿のコメント欄、または Twitter 等でご連絡ください。


参考