👋

JupyterLab in Docker for M1 Macで動かすJuliaとRCall

2022/02/13に公開

概要

  • 今回,Docker for M1 Macで作ったJupyterLab環境でJuliaが動くようにしました.
  • RCall.jlも動くようにしました.
  • コンテナをbuildしたときの手順を残しています.
  • Juliaのバージョン1.7.2がリリースされて,RCall.jl[1]が動くようになったことが作成のきっかけです.(1.7.1ではうまく動かなかった...)

全ファイルについては,以下をご確認ください.
https://github.com/yuiki-iwayama/JupyterLab-Docker

前提知識

  • 基本的なdockerコマンド, docker-composeコマンドの使い方
  • JupyterLabの使い方

試行環境とファイル構成

  • M1 MacBook Pro
  • macOS Monterey 12.0.1
  • Docker Desktop 4.4.2 (for Mac)
  • ファイル構成
.
├── Dockerfile
├── docker-compose.yml
├── init.sh
└── packages.jl

手順

手順概要

  1. Dockerfileを作成する
  2. init.shを作成する
  3. docker-compose.ymlを作成する
  4. コンテナをbuildする
  5. JuliaとRCallをJupyterLabで試しに動かしてみる

1. Dockerfileを作成する


まずは,Dockerfileを書いていきます.

Dockerfile
Dockerfile
FROM continuumio/anaconda3:latest

# 必要なパッケージを入れる.
RUN apt-get update && apt-get install -y --no-install-recommends \
    fonts-ipaexfont \
    libgl1-mesa-dev \
    build-essential \
    ca-certificates \
    cmake \
    gcc \
    g++ \
    openssh-client \
    bash-completion \
    vim \
    software-properties-common \
    dirmngr \
    gnupg \
    apt-transport-https \
    ca-certificates

# Debianの設定
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

# RとRライブラリのインストール
RUN apt-get update && apt-get install -y r-base \
  && Rscript -e "install.packages(c('tidyverse', 'dplyr'), dependencies = TRUE, error = TRUE)"

# JuliaとJuliaのパッケージをインストール
WORKDIR /opt
ENV julia julia-1.7.2
COPY packages.jl /tmp/packages.jl
RUN wget https://julialang-s3.julialang.org/bin/linux/aarch64/1.7/${julia}-linux-aarch64.tar.gz \
  && tar zxvf ${julia}-linux-aarch64.tar.gz \
  && ln -s /opt/${julia}/bin/julia /usr/local/bin/julia \
  && julia /tmp/packages.jl \
  && rm ${julia}-linux-aarch64.tar.gz /tmp/packages.jl

RUN apt-get autoremove -y \
  && apt-get clean
WORKDIR /work

COPY init.sh /usr/bin
CMD ["/bin/bash", "/usr/bin/init.sh"]
  1. apt-get installでRのインストールに必要なものをインストールする
RUN apt-get update && apt-get install -y --no-install-recommends \
    fonts-ipaexfont \
    libgl1-mesa-dev \
    build-essential \
    ca-certificates \
    cmake \
    gcc \
    g++ \
    openssh-client \
    bash-completion \
    vim \
    software-properties-common \
    dirmngr \
    gnupg \
    apt-transport-https \
    ca-certificates
  • Rのインストールに必要なパッケージである,software-properties-commondirmngr, gnupg, apt-transport-https, ca-certificatesをインストールする
  1. RとRのライブラリをインストールする[2]
RUN apt-get update && apt-get install -y r-base \
  && Rscript -e "install.packages(c('tidyverse', 'dplyr'), dependencies = TRUE, error = TRUE)"
  • apt-get installr-baseをインストールする
  • RCallで使いたいRのライブラリをRscriptコマンドでインストールする
  1. JuliaとJuliaのパッケージをインストールする
WORKDIR /opt
ENV julia julia-1.7.2
COPY packages.jl /tmp/packages.jl
RUN wget https://julialang-s3.julialang.org/bin/linux/aarch64/1.7/${julia}-linux-aarch64.tar.gz \
  && tar zxvf ${julia}-linux-aarch64.tar.gz \
  && ln -s /opt/${julia}/bin/julia /usr/local/bin/julia
  && julia /tmp/packages.jl \
  && rm ${julia}-linux-aarch64.tar.gz /tmp/packages.jl
  • バージョンを管理しやすいようにENVでjuliaのバージョンを記述しておく
  • M1 Macなのでlinux-aarch64のURLを指定してwgetコマンドでダウンロードする
  • tarコマンドでダウンロードしたファイルを解凍する
  • ln -sコマンドでjuliaのシンボリックリンクを貼る
  • Juliaで使いたいライブラリをpackages.jlに記載しておいてjuliaコマンドでインストールする
packages.jl
packages.jl
using Pkg
Pkg.add([
    "IJulia",
    "PyCall",
    "DataFrames",
    "PyPlot",
    "Distributions",
    "ForwardDiff",
    "Statistics",
    "JuliaFormatter",
    "RCall"
])
  1. init.shファイルをコピーして実行する
COPY init.sh /usr/bin
CMD ["/bin/bash", "/usr/bin/init.sh"]

2. init.shを作成する


JupyterLabを起動するためのコマンドを記載するinit.shファイルを書いていきます.

init.sh
init.sh
#!/bin/bash

source /etc/bash_completion
jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=''
  • jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=''でJupyterLabが立ち上がる

3. docker-compose.ymlを作成する


コンテナを立ち上げるのに必要なdocker-compose.ymlを書いていきます.

docker-compose.yml
docker-compose.yml
version: "3"
services:
  notebook:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: "jupyterlab"
    ports:
      - 8888:8888
    restart: always
    volumes:
      - ./work:/work

4. コンテナをbuildする


Dockerコンテナをbuildできる環境もできたので,いよいよコンテナを立ち上げます.

  • $ docker-compose up -d --build
  • 立ち上がったら,ブラウザでlocalhost:8888にアクセスしてJupyterLabがうまく起動できているか確認する

5. JuliaとRCallをJupyterLabで試しに動かしてみる


JupyterLabが立ち上がったので,実際にJuliaとRCallがうまく動くか確かめます.

  • LauncherでJulia 1.7.2を選択する
  • 実際にセルにprintln("Hello World")と書いてrunするとちゃんと返ってくる
  • using RCallで呼び出したあと,rcopy(R"1 + 1")と書いてrunするとちゃんと返ってくる

参考

脚注
  1. Introduction · RCall.jlをご確認ください. ↩︎

  2. Debian Packages of R Softwareを参考にしてRのバージョン4.1.2をインストールしようとしましたが,うまくインストール出来ないです ↩︎

  3. 詳細を知りたい方は,M1 Mac で Docker を動かすための知識とノウハウをご確認ください. ↩︎

Discussion