再現性ある環境がいつでもどこでも再現できて大変便利な rocker/verse の docker コンテナですが、
利用者側で細かい設定をしたい部分も色々出てくると思います。
案外情報が見つかりにくかったので、健忘メモがてら書いておきます。
RStudio 設定ファイルの場所
これはコンテナ内では場所決め打ちです。
dockerビルドのディレクトリ内に、rstudio-prefs_mysettings.json
のような名前で保存しておき、dockerfile内でコピーリネームするようにしています。
# R4.0ごろからデフォルトで出てくるマージンが邪魔
COPY --chown=rstudio:rstudio rstudio-prefs_mysettings.json /home/rstudio/.config/rstudio/rstudio-prefs.json
RUN chmod 755 /home/rstudio/.config/rstudio/rstudio-prefs.json
JSONファイルの中身
書き方を調べても良いのですが、大変なので【一度実行して環境設定】を行った後、
【保存されたjsonファイルの中身からコピペ】する方が早いかなと思います。
{
"reuse_sessions_for_project_links": true,
"show_margin": false,
"posix_terminal_shell": "zsh",
"real_time_spellchecking": false,
"editor_theme": "Solarized Dark",
"spelling_dictionary_language": "en_US"
}
Rprofileの場所
続いて、R環境のデフォルト設定ファイルも書き換えましょう。
同じくDockerfile内からコピーリネームです。
僕はビルドディレクトリ内に dotRprofile
として保存し、コピーリネームしています
# Rプロファイルをコピー - RStudio起動時に実行したいRスクリプトをこのファイルに書くことが出来る
# RStudioのみ再起動した場合も読み込まれます
COPY --chown=rstudio:rstudio dotRprofile /home/rstudio/.Rprofile
~/.Rprofile の中身
こちらは通常の R スクリプトです。
僕は docker-compose 実行時に、ホスト側ボリュームをマウントしてその中にプロジェクトに関するファイル一式を保存するようにしています。
再現性確保のために、プロジェクトごとにコンテナを分けていますので、
コンテナログインと同時に、プロジェクトが開くような設定も加えます。
(この書き方で、RStudioでの実行時のみプロジェクトを開くように出来ます。コンテナ内で R
した場合には影響を与えません)
# Rprofile
# cranミラーを国内にした方が、早くDLできて本家の負担も分散できます。
options(repos = c(CRAN = "https://ftp.yz.yamagata-u.ac.jp/pub/cran/"))
# RStudioでのRセッション開始時に自動でプロジェクトを開きます
setHook("rstudio.sessionInit", function(newSession) {
if (newSession && is.null(rstudioapi::getActiveProject()))
rstudioapi::openProject("~/host_volume/myproject/someproj.Rproj")
}, action = "append")
# このファイル内にRスクリプトを入れておくと実行時に起動されます。
# healthchecks.io のトリガーを仕込んでみたり
system('curl https://hc-ping.com/XXXXXXXXXXXXXXXXXXX')
docker-compose で /dev/shm をホストにバインド他
Mac/Linux の方限定ですが、デフォルトだと「2GB」などしか仮想メモリが使えず、それを超えた瞬間にコンテナが落ちてしまいます。
手っ取り早いのは/dev/shmをホスト側にマウントしてしまうことです。(セキュリティ的にはベストではないので、自分たちで管理しているホストの場合のみこれを行いましょう)
Mac/Linuxどちらでもそのまま動きます。
ベストプラクティスでは無いのですが(もし不特定多数に公開するような使い方なら厳密に使うメモリ管理したほうが安全)バッドと言われる程でも無いので、その時々で必要メモリ量がバラバラなデータサイエンス系処理ではこうしておくと常に「ホストのメモリ上限」まで使えて便利だと思っています。
(Windows/Windows+WSLはこの問題は未解決のままなので無理と思われます。 https://github.com/microsoft/WSL/issues/7018 異なる方法を試してみてください。 docker --shm-size=10gb
オプションなど)
また、awsやgcpなどの各種認証トークンはgitなどに入れず、ホスト側ディレクトリに保存して手動で管理するようにしています。
version: "3"
services:
r:
image: myserver.local:5000/myrepo/r
volumes:
- /dev/shm:/dev/shm
- ~/r/host_volume:/home/rstudio/host_volume
# 認証トークンなどは手動で管理
- ~/r/.token:/home/rstudio/.token
以上、少々とっちらかってしまいましたが、どなたかの参考になれば!