3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

RStudio server の細かい設定を dockerfile から自動化する

Last updated at Posted at 2022-02-02

再現性ある環境がいつでもどこでも再現できて大変便利な 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ファイルの中身からコピペ】する方が早いかなと思います。

/home/rstudio/.config/rstudio/rstudio-prefs.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 した場合には影響を与えません)

/home/rstudio/.Rprofile
# 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などに入れず、ホスト側ディレクトリに保存して手動で管理するようにしています。

docker-compose.yaml
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

以上、少々とっちらかってしまいましたが、どなたかの参考になれば!

3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?