概要
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 ファイルをご覧ください。
ファイル構成
リポジトリは主にこのようなファイル構成になっています
.
├── .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/Dockerfile
の COPY
命令でこのファイルをコンテナ内にコピーしています:
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.yml
で volume
の設定を変更します。
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 ECR や Azure Container Registry も良い選択肢だと思います。
同じようにイメージをビルドしているのに結果が再現しない
_rstudio/Dockerfile
やその他のファイルが全く同一でも、ビルドを実行する環境や時期によって作成されるイメージは異なる可能性があります。
原因としてはベースイメージの更新やインストールするパッケージのバージョンアップなどが考えられます。 タグではなく digest 値でベースイメージを指定する、バージョンを指定してパッケージをインストールするなどで安定性を高めることができます。
最も確実に再現性を担保する方法はビルド済みのイメージを共有することです。 イメージの共有には Docker レジストリを利用します。 詳しくは Docker Hub Quickstart や Google Container Registry のドキュメント などを参考にしてください。
フィードバック
このテンプレートリポジトリ https://github.com/terashim/rstudio-docker-project-template は MIT ライセンスで公開していますので、特に許可なく誰でも自由に利用できます。
不具合の報告や改善のご意見等は GitHub の Issue 、この投稿のコメント欄、または Twitter 等でご連絡ください。
参考
- テンプレートリポジトリを作成する - GitHub Docs
- Masahito Zembutsu Dockerイメージの理解とコンテナのライフサイクル
- 初心者目線のDocker/RStudio/rstan環境案内 – Kosugitti's BLOG
- Rocker Project
- Using Projects – RStudio Support
- RStudio 1.3 Preview: Configuration and Settings | RStudio Blog
- RStudio 1.3 Preview: Real Time Spellchecking | RStudio Blog
- Compose file version 3 reference | Docker Documentation