Skip to content

Instantly share code, notes, and snippets.

@mokztk
Last active November 2, 2020 05:01
Show Gist options
  • Save mokztk/be9e0d8982fd32987dbb5c9552a9d4a7 to your computer and use it in GitHub Desktop.
Save mokztk/be9e0d8982fd32987dbb5c9552a9d4a7 to your computer and use it in GitHub Desktop.
rocker/tidyverse:4.0.(1|2) に日本語設定と TinyTex、radian/Python3 、頻用パッケージを追加した作業用イメージ

About this image

  • rocker/tidyverse
    • 現時点では :4.0.1 で開発
    • 2020-10-14 に RSPM #344 (2020-10-13) で固定されたのでベースを :4.0.2 に変更
  • Ubuntu mirror
  • 日本語ロケール
    • Ubuntu の language-pack-ja, language-pack-ja-base
    • 環境変数で ja_JP.UTF-8 ロケールとタイムゾーン Asia/Tokyo を指定
    • フォントは下記のいずれか
      • IPAex明朝/ゴシック(Ubuntu の fonts-ipaexfont パッケージ)
      • Noto Sans/Serif JP(Google Fonts で配布されている日本語サブセット版)
      • Noto Sans/Serif CJK JP(容量節約で fonts-noto-cjk-extra は使わず、Google Noto Fonts からOTF版をダウンロードして必要なものを手動でインストール)
  • radian: A 21 century R console
  • Python
    • radian で使うために python をセットアップするなら、R と連携できるようにする?
    • そのままでは、Python共有ライブラリや Pandas がないので reticulate は動かない
      • # apt-get install -y libpython3.8 python3-pandas
      • # echo "/usr/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libpython3.8.conf
      • # ldconfig
      • # Rscript -e "install.packages('reticulate')"
  • TinyTeX
    • XeLaTeX + BXjscls で日本語PDFを作成するのに必要なパッケージも予めインストールしてしまう
    • rocker/tidyverse:4.0.2 になったら、 install_tinytex(..., version = "2020.09") など固定する?
  • R の頻用パッケージ
  • 環境変数 PASSWORD の仮設定
    • 数ヶ月前から DISABLE_AUTH がうまく機能しなくなっていた(RStudio serverのcookie認証の問題とのこと)が、RStudio server 1.3.1093 では機能している
    • DISABLE_AUTH=true をイメージに埋め込んでしまうと、パスワードが有効にできなくなるので DISABLE_AUTH は起動オプションで
    • Docker Desktop など -e PASSWORD=... が設定できないGUIでも起動テストできるように仮のパスワードを埋め込んでおく

rocker-org/rocker-versioned2 のように、目的別のスクリプトを使って Dockerfile 自体は極力シンプルにしてみる。

Gist ではディレクトリが使えないので、各インストールスクリプトは "scripts__*" として保存してある。
docker image build の際は Dockerfile と同じ階層の "my_scripts" というディレクトリに "install_*.sh" と改名して格納しておく。 改行コードが LF(UNIX) でないとエラーになるので注意。

# rocker/tidyverse に日本語設定と頻用パッケージ、および TinyTeX, Radian を追加
# 2020-10-15 に RSPM #344 (2020-10-13) に固定されたのでベースを変更
FROM rocker/tidyverse:4.0.2
# Ubuntuミラーサイトの設定(自動選択)
RUN sed -i.bak -e 's%http://[^ ]\+%mirror://mirrors.ubuntu.com/mirrors.txt%g' /etc/apt/sources.list
# 日本語設定と必要なライブラリ(Rパッケージ用は別途スクリプト内で導入)
RUN set -x \
&& apt-get update \
&& apt-get install -y --no-install-recommends \
language-pack-ja-base \
# fonts-ipaexfont \
libxt6 \
ssh \
&& /usr/sbin/update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja" \
&& /bin/bash -c "source /etc/default/locale" \
&& ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# setup script
# 各スクリプトは改行コード LF(UNIX) でないとエラーになる
COPY my_scripts /my_scripts
RUN chmod 775 my_scripts/*
RUN /my_scripts/install_r_packages.sh
RUN /my_scripts/install_pandas.sh
RUN /my_scripts/install_radian.sh
RUN /my_scripts/install_notocjk.sh
#RUN /my_scripts/install_notojp.sh
USER rstudio
RUN /my_scripts/install_tinytex.sh
# ${R_HOME}/etc/Renviron のタイムゾーン指定(Etc/UTC)を上書き
RUN echo "TZ=Asia/Tokyo" >> /home/rstudio/.Renviron
USER root
ENV LANG=ja_JP.UTF-8 \
LC_ALL=ja_JP.UTF-8 \
TZ=Asia/Tokyo \
PASSWORD=password
CMD ["/init"]
#!/bin/bash
# Noto Sans/Serif CJK JP フォントのインストール
set -x
# apt-get install fonts-notocjk-extra とすると 300MBくらい必要なので、
# zxjafont.sty の 'noto' オプションで使用する7書体と等幅のRegularのみ手動インストール
wget https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip
wget https://noto-website-2.storage.googleapis.com/pkgs/NotoSerifCJKjp-hinted.zip
unzip NotoSansCJKjp-hinted.zip NotoSans*.otf
unzip NotoSerifCJKjp-hinted.zip NotoSerif*.otf
mkdir /usr/share/fonts/noto
mv NotoSerifCJKjp-Light.otf /usr/share/fonts/noto/
mv NotoSerifCJKjp-Regular.otf /usr/share/fonts/noto/
mv NotoSerifCJKjp-Bold.otf /usr/share/fonts/noto/
mv NotoSansCJKjp-Regular.otf /usr/share/fonts/noto/
mv NotoSansCJKjp-Bold.otf /usr/share/fonts/noto/
mv NotoSansCJKjp-Black.otf /usr/share/fonts/noto/
mv NotoSansCJKjp-Medium.otf /usr/share/fonts/noto/
mv NotoSansMonoCJKjp-Regular.otf /usr/share/fonts/noto/
chmod 644 /usr/share/fonts/noto/*
fc-cache -fv
rm Noto*
# 標準フォントとして手動で入れた Noto fonts を認識できるようにする
# 設定しておけば、最低限グラフの文字化けはなくなる
mkdir -p /home/rstudio/.config/fontconfig
cat > /home/rstudio/.config/fontconfig/fonts.conf << EOF
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>Noto Serif CJK JP</family>
<family>Noto Serif JP</family>
<family>IPAex明朝</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>Noto Sans CJK JP</family>
<family>Noto Sans JP</family>
<family>IPAexゴシック</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Noto Sans Mono CJK JP</family>
</prefer>
</alias>
</fontconfig>
EOF
chown -R rstudio:rstudio /home/rstudio/.config
#!/bin/bash
# Noto Sans/Serif JP フォントのインストール
# Google Fonts でwebフォント用に配布されている日本語のみのサブセット版
#
# フォントのアドレスは Google Fonts Developer API のテスト画面から見られるJSONより抜粋したもの。
# インストールされるフォント名はCJKなしの "Noto Sans/Serif JP"
# zxjafont.sty のプリセット名は "noto-jp" を使う。
set -x
mkdir /usr/share/fonts/notojp
wget -q -O /usr/share/fonts/notojp/NotoSerifJP-Light.otf http://fonts.gstatic.com/s/notoserifjp/v7/xn77YHs72GKoTvER4Gn3b5eMZHKMRkgfU8fEwb0.otf
wget -q -O /usr/share/fonts/notojp/NotoSerifJP-Regular.otf http://fonts.gstatic.com/s/notoserifjp/v7/xn7mYHs72GKoTvER4Gn3b5eMXNikYkY0T84.otf
wget -q -O /usr/share/fonts/notojp/NotoSerifJP-Bold.otf http://fonts.gstatic.com/s/notoserifjp/v7/xn77YHs72GKoTvER4Gn3b5eMZGKLRkgfU8fEwb0.otf
wget -q -O /usr/share/fonts/notojp/NotoSansJP-Regular.otf http://fonts.gstatic.com/s/notosansjp/v27/-F62fjtqLzI2JPCgQBnw7HFowAIO2lZ9hg.otf
wget -q -O /usr/share/fonts/notojp/NotoSansJP-Bold.otf http://fonts.gstatic.com/s/notosansjp/v27/-F6pfjtqLzI2JPCgQBnw7HFQei0q1H1hj-sNFQ.otf
wget -q -O /usr/share/fonts/notojp/NotoSansJP-Black.otf http://fonts.gstatic.com/s/notosansjp/v27/-F6pfjtqLzI2JPCgQBnw7HFQQi8q1H1hj-sNFQ.otf
wget -q -O /usr/share/fonts/notojp/NotoSansJP-Medium.otf http://fonts.gstatic.com/s/notosansjp/v27/-F6pfjtqLzI2JPCgQBnw7HFQMisq1H1hj-sNFQ.otf
chmod 644 /usr/share/fonts/notojp/*
fc-cache -fv
# 標準フォントとして手動で入れた Noto fonts を認識できるようにする
# 設定しておけば、最低限グラフの文字化けはなくなる
mkdir -p /home/rstudio/.config/fontconfig
cat > /home/rstudio/.config/fontconfig/fonts.conf << EOF
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>Noto Serif CJK JP</family>
<family>Noto Serif JP</family>
<family>IPAex明朝</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>Noto Sans CJK JP</family>
<family>Noto Sans JP</family>
<family>IPAexゴシック</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Noto Sans Mono CJK JP</family>
</prefer>
</alias>
</fontconfig>
EOF
chown -R rstudio:rstudio /home/rstudio/.config
#!/bin/bash
set -x
# R から {reticulate} で Python3 を使えるようにセットアップ
# Python3のインストール
apt-get update
apt-get install -y libpython3.8 python3-pandas python3-pip
apt-get clean
rm -rf /var/lib/apt/lists/*
# python の共有ライブラリを登録
echo "/usr/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libpython3.8.conf
ldconfig
# R に {reticulate} をインストール
R -e 'install.packages("reticulate")'
#!/bin/bash
# R パッケージのインストール
set -x
# 依存ライブラリの追加
apt-get update
apt-get install -y --no-install-recommends \
graphviz \
libgraphviz-dev \
imagemagick \
libmagick++-dev \
libgl1-mesa-dev \
libglu1-mesa-dev \
librsvg2-dev \
libxft-dev
apt-get clean
rm -rf /var/lib/apt/lists/*
# 先にRSPMにないものをインストール
Rscript -e "BiocManager::install(c('graph', 'Rgraphviz'))"
# RSPMからインストール
install2.r --error --deps TRUE --ncpus -1 --skipinstalled \
pacman \
tidylog \
furrr \
glmnetUtils \
pROC \
cmprsk \
psych \
clinfun \
car \
survminer \
prophet \
GGally \
ggfortify \
gghighlight \
ggsci \
ggrepel \
patchwork \
tableone \
gt \
gtsummary \
minidown
# since package "export" was removed from CRAN on 2020-02-21,
# install dev version from GitHub repo (commit d29650b / 2020-06-22)
install2.r --error --deps TRUE --ncpus -1 --skipinstalled \
officer \
rvg \
openxlsx \
flextable \
xtable \
rgl \
stargazer \
tikzDevice
installGithub.r tomwenseleers/export@d29650b
# cleaning
rm /tmp/downloaded_packages/*
#!/bin/bash
set -x
# radian: A 21 century R console.
# pip3 を install_pandas.sh などで既に入れていればスキップ
if [ ! -e "/usr/bin/pip3" ]; then
apt-get update
apt-get install -y --no-install-recommends python3-pip
apt-get clean
rm -rf /var/lib/apt/lists/*
fi
# radianのインストール
pip3 install -U radian jedi
# radianの設定
cat > /home/rstudio/.radian_profile << EOF
options(radian.color_scheme = "monokai")
options(radian.auto_match = TRUE)
options(radian.prompt = "\033[0;32mr$>\033[0m ")
options(radian.escape_key_map = list(
list(key = "-", value = " <- "),
list(key = "m", value = " %>% ")
))
options(radian.force_reticulate_python = TRUE)
EOF
chown rstudio:rstudio /home/rstudio/.radian_profile
#!/bin/bash
# TinyTex本体と必要なパッケージのインストール
set -x
Rscript -e 'tinytex::install_tinytex(dir = "/home/rstudio/.TinyTeX/")'
/home/rstudio/.TinyTeX/bin/x86_64-linux/tlmgr install \
bxjscls \
zxjatype \
zxjafont \
adobemapping \
amscls \
arphic \
beamer \
cjk \
cjkpunct \
cns \
ctablestack \
ctex \
everyhook \
fandol \
fonts-tlwg \
fp \
garuda-c90 \
latex-base-dev \
luatexbase \
luatexja \
mptopdf.x86_64-linux \
mptopdf \
ms \
norasi-c90 \
pgf \
platex.x86_64-linux \
platex \
platex-tools \
ptex.x86_64-linux \
ptex \
ptex-base \
ptex-fonts \
svn-prov \
translator \
ttfutils.x86_64-linux \
ttfutils \
uhc \
ulem \
uplatex.x86_64-linux \
uplatex \
uptex.x86_64-linux \
uptex \
uptex-base \
uptex-fonts \
wadalab \
xcjk2uni \
xecjk \
xpinyin \
zhmetrics \
zhmetrics-uptex \
zhnumber
/home/rstudio/.TinyTeX/bin/x86_64-linux/tlmgr path add
@mokztk
Copy link
Author

mokztk commented Oct 8, 2020

[2020-10-08]
とりあえず作成。image size は 4.28 GB。

> length(.packages(all.available = T))
[1] 382

@mokztk
Copy link
Author

mokztk commented Oct 12, 2020

[2020-10-12]
install_radian.sh で Pandas のインストール(matplotlibなど推奨パッケージも含む)をするようにして、Rから {reticulate} で python を使えるようにした。image size は 4.54 GB に増加。
radian は最低限の python3-pip 環境で動くので、スクリプトは install_pandas.sh と(新) install_radian.sh などに分けるべき?

> length(.packages(all.available = T))
[1] 384

@mokztk
Copy link
Author

mokztk commented Oct 12, 2020

[2020-10-12 (2)]
python 関係のインストールスクリプトを install_pandas.shinstall_radian.sh に分割した。
install_radian.sh の方では、pip3 があれば新しく apt でインストールする過程を省略する。
image size は 4.54 GB で変わらず。

RUN /my_scripts/install_pandas.sh をコメントアウトして、install_radian.sh で pip3 のインストールが動くことも確認。
install_pandas.sh をコメントアウトした場合、image size は 4.28GB でこちらも変わらず。

@mokztk
Copy link
Author

mokztk commented Oct 13, 2020

[2020-10-13]
~/.config/fontconfig/fonts.conf を作って手動で入れた Noto fonts を標準フォントとして登録するようにした。
これによりパッケージで IPAexフォントを入れなくても一応グラフの文字化けは回避できるようになったので IPAexは除外。
また、Ubuntuのミラーを自動選択するよう参照先を mirror://mirrors.ubuntu.com/mirrors.txt とした。

image size は install_notojp 版で 4.41GB、install_notocjk 版で 4.66GB。
(install_pandas を外して Noto CJK fonts で 4.29GB)

@mokztk
Copy link
Author

mokztk commented Oct 14, 2020

[2020-10-15]
roker/tidyverse:4.0.2 のパッケージインストール元が RSPM #344 (2020-10-13) に固定されたのでベースを変更。
image size は install_pandas, install_radian, install_tinytex すべて有効にして install_notocjk 版で 4.7GB。

> length(.packages(all.available = TRUE))
[1] 395

@mokztk
Copy link
Author

mokztk commented Oct 16, 2020

[2020-10-16]
${R_HOME}/etc/Renviron でシステムとは別にR用のタイムゾーンが指定されている。
rocker/r-ver:4.0.2 では TZ=Etc/UTC が決め打ちされているので、~/.RenvironTZ=Asia/Tokyo を指定して上書きするようにした。

@mokztk
Copy link
Author

mokztk commented Oct 19, 2020

[2020-10-19]
radian 上で Python (REPL) が正常に機能するよう調整。jedi を入れて reticulate::repl_python() でも補完が働くようにした。
image size は 4.71GB に微増。

@mokztk
Copy link
Author

mokztk commented Nov 2, 2020

[2020-11-02]
以降の作業は https://github.com/mokztk/RStudio_docker でおこなうこととする。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment