やりたいこと
dockerのJupyterでRでテキストマイニングやりたい。MeCabとRMeCabを使ったら出来そう!と思って jupyter/datascience-notebook のdockerコンテナにインストールしようとしてみたらハマったのでメモ。
起こった問題
とりあえずjupyter/datascience-notebookを起動してRのノートブックを作成するまではこちらなどを参考にしてさくっと。とりあえずJupyter上から環境を構築してみようとMeCabをインストールまでは手順通りでよかったのだが、いざRMeCabをインストールしようとしたら、エラーメッセージが・・・
# RMeCabをインストールしようとしたら・・・
install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source")
# うまくいかなかった
Warning message in install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source"):
“installation of package ‘RMeCab’ had non-zero exit status”Updating HTML index of packages in '.Library'
Making 'packages.html' ... done
もう少し詳しくエラー内容を見るため、JupyterのterminalからRを起動し、同じようにインストールを試みる。
R
install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source")
RMeCab.cpp:59:70: error: narrowing conversion of ‘144’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
どうやらc++のコード中でint->charのキャストに失敗している?エラーメッセージなどで検索していると、RMeCabはgcc-5の環境でインストールする必要があるらしい 。自分の環境のgccはバージョン7だった。これがRMeCabインストール失敗の原因のようだ。
※int->charのキャストに失敗するのはこれと同じ現象かもしれない。
インストール手順
最終的にうまくいったのは以下の手順。gcc-5を使ってRMeCabをインストールする。
0. 前提
こちらの記事などを参考にsudo
が使えるjupyter/datascience-notebookのコンテナが立ち上がっている
1. MeCabをインストールする
install - rmecabのLinuxの説明に沿ってインストール。
sudo apt update
sudo apt install mecab libmecab-dev mecab-ipadic-utf8
インストールできているかを確認。
mecab
インストールに成功したよ!
以下のような結果が表示されたらOK。
インストール 名詞,一般,*,*,*,*,インストール,インストール,インストール
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
成功 名詞,サ変接続,*,*,*,*,成功,セイコウ,セイコー
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
よ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
! 記号,一般,*,*,*,*,!,!,!
EOS
2. gcc-5をインストールする
gcc-5をインストール。
sudo apt install gcc-5
sudo apt install g++-5
sudo apt install gfortran-5
3. update-alternativesでバージョンを切り替え
複数のgccバージョンがある環境ではupdate-alternativesでバージョンを切り替えて使う。今回はgcc-7 <->gcc-5の切り替えが必要。
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10
sudo update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-5 10
ちなみに登録後は
update-alternatives --config gcc
とすれば、登録してあるバージョンから選択して切り替えができる。
参考
Ubuntu 14.04にGCC 4.9 をインストールする
update-alternativesの使い方
4. RMeCabをインストール
gccが導入出来たら、いよいよRMeCabをインストールする。terminalでRを起動するか、JupyterでRのNotebookを作成し
install.packages("RMeCab", repos = "http://rmecab.jp/R", type = "source")
でインストール。成功したかどうかを確認する。
library(RMeCab)
RMeCabC("インストールに成功したよ!")
できた!
Dockerfileとdocker-compose.yml
ここまでの作業をまとめたDockerfileとdocker-compose.ymlファイルを作成した。同一ディレクトリにこの2つのファイルを置いてdocker-compose up
。
version: "2"
services:
jupyter_rmecab: # サービス名
container_name: Jupyter-RMeCab
build: . # 現在のディレクトリのdockerfileから構築
image: mochimo/jupyter-rmecab # buildで作るイメージ名
ports:
- "8888:8888" # ポート <host port>:<container port>
user: root # sudoのため
volumes:
- "/home/[User]/[work]:/home/jovyan/work/" # workディレクトリのマウント。[User],[work]は適宜自分のユーザー名と作業フォルダ名に変更
environment:
TZ: Asia/Tokyo
GRANT_SUDO: "yes" # sudoコマンドを使えるようにする
restart: always # 常に自動で再起動。主にOS起動時に自動起動させるため
command: start-notebook.sh --NotebookApp.token='' # コンテナ起動時の引数
FROM jupyter/datascience-notebook
LABEL maintainer="mochimo"
USER root
# font/gcc5 インストール
RUN apt-get update && apt-get install -y \
fonts-ipaexfont \
gcc-5 \
g++-5 \
gfortran-5
# mecab インストール
RUN apt-get update && apt-get install -y mecab libmecab-dev mecab-ipadic-utf8
# gcc-5に切り替え
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10 && \
update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-5 10
USER $NB_UID
# RMeCabのインストール
RUN R -e "install.packages(c('RMeCab'), repos='http://rmecab.jp/R', type='source')"