訳があってRをやらなくてはならなくなった。

環境構築をするにあたってローカルにインストールすることも考えたが、再現性やソフトの競合を避けるという意味でdockerコンテナ上に環境を構築することにした。

単にrstudioのイメージを使用して環境構築することができなかったが、いくつか工夫をすることで対処することが可能だった。

その方法をメモしておく。


DockerでR studioを環境構築

R studioによる解析を行うための環境構築の方法のうちの一つとして、Dockerを用いて構築する方法がある。

rocker/rstudioイメージが用意されており、ローカル環境を汚すことなく、とても簡単に環境を構築することができる。

しかしながら、今日(2022/09/26)時点ではM1 macbook (ARMチップ) において先のDockerイメージを用いて環境構築ができない。

エラーの発生した状況

実行したコマンドは以下。なお、このコマンドはrocker/rstudioイメージのドキュメントを参考に作成した。

docker run --name rstudio -e PASSWORD=rstudio --rm -it -p 8787:8787 rocker/rstudio:4.1.3

ターミナル上に生成されたエラーメッセージは以下。

2022-09-12T13:50:15.898469Z [rserver] ERROR system error 1 (Operation not permitted); OCCURRED AT rstudio::core::Error rstudio::core::system::posix::{anonymous}::restorePrivilegesImpl(uid_t) src/cpp/shared_core/system/PosixSystem.cpp:66; LOGGED FROM: void rstudio::server::pam_auth::{anonymous}::assumeRootPriv() src/cpp/server/ServerPAMAuth.cpp:57
rserver[1178]: ERROR system error 1 (Operation not permitted); OCCURRED AT rstudio::core::Error rstudio::core::system::posix::{anonymous}::restorePrivilegesImpl(uid_t) src/cpp/shared_core/system/PosixSystem.cpp:66; LOGGED FROM: rstudio::core::Error rstudio::core::system::launchChildProcess(std::__cxx11::string, std::__cxx11::string, rstudio::core::system::ProcessConfig, rstudio::core::system::ProcessConfigFilter, PidType*) src/cpp/core/system/PosixSystem.cpp:2168

これについていくつかissueが報告されているので、自分だけの問題ではないと考えている。

解決した方法

rocker/rstudioイメージの元になっているrocker/r-verイメージをベースにrstudioをインストールすることで対応する。

具体的には、提案されていた解決方法を少し変えてDockerfileを書いて対応した。

親切なことにイメージ内にビルド用のコマンドが内蔵されているのでそれを呼び出してあげれば良い。

具体的なファイル構成や内容については以下。

ファイル構成

.
├── docker
│   ├── Dockerfile
│   ├── _config.sh
│   ├── build.sh
│   └── run.sh

build.shにはdocker image buildコマンド、run.shにはdocker container runコマンドが書かれており、それらで使用する変数を_config.shにて定義、取得し、読み込ませている。

Dockerfile

# References
# https://github.com/rocker-org/rocker-versioned2/issues/144#issuecomment-1224978820
# Base image
FROM rocker/r-ver:4.1.3

# variables
ARG user_name

# environment variables
ENV S6_VERSION=v2.1.0.2
ENV RSTUDIO_VERSION=daily
ENV DEFAULT_USER=${user_name}
ENV PANDOC_VERSION=default
ENV PATH=/usr/lib/rstudio-server/bin:$PATH

# set up the environment
RUN /rocker_scripts/install_rstudio.sh
RUN /rocker_scripts/install_pandoc.sh

# ports
EXPOSE 8787

# initialize
CMD ["/init"]

# install packages
RUN r -e "install.packages('rmarkdown', repos='http://cran.rstudio.com/')"

_config.sh

#!/bin/bash

# variable
SCRIPT_DIR=$(cd $(dirname $0)/..; pwd)
DIR_NAME=$(basename $SCRIPT_DIR)
IMAGE_NAME="rstudio"
USER_NAME="rstudio"
IMAGE_VERSION=4.1.3
DOCKER_USER_ID=yu9824

build.sh

#!/bin/bash

# config
source $(dirname $0)/_config.sh

# build image
docker image build \
    --build-arg user_name=$USER_NAME \
    -t $DOCKER_USER_ID/$IMAGE_NAME:$IMAGE_VERSION $SCRIPT_DIR/docker

run.sh

#!/bin/bash

# config
source $(dirname $0)/_config.sh

# run container
docker container run -it --rm \
    --mount type=bind,source="$SCRIPT_DIR",dst=/home/"$USER_NAME"/"$DIR_NAME" \
    -p 8787:8787 -e PASSWORD=rstudio \
    --name $DIR_NAME $DOCKER_USER_ID/$IMAGE_NAME:$IMAGE_VERSION

上記を準備したのち、まずdocker image buildコマンドを実行する。

sh docker/build.sh

続いて、docker container runコマンドを実行する。

sh docker/run.sh

その後、http://localhost:8787にアクセスし、idとパスワードを入力する。

2022-09-26-rstudio-docker-login.png

パスワードはrun.shにて指定したものになる。

特に変更していなければ両方rstudioになるが、ご自身で変えることをおすすめする。

ログインが完了するとR studioの画面になる。

2022-09-26-rstudio-docker-top-menu.png

ディレクトリをマウントしているので、外からもらったファイルを使って解析をすることも可能。

これらのファイルは以下のリポジトリにまとめた。

https://github.com/yu9824/rstudio

コメント

機会があればVSCodeでも解析できるようにしようと思うが、それをしようとしているサイトが少ないことからR Studioが一番よいRの解析環境なのではないかと思うので、とりあえず慣れてみようと思う。