ここでは、Docker を用いてGphysを Mac(M1, 2020)上で動かすための方法を、以下の流れで紹介する。
Dockerを使うため、他のOS(Windows, Ubuntu, など)からでも 同様の方法でGphysを動かすことができるので、ぜひ参考にしてほしい。
地球流体電脳 Ruby プロジェクトが提供する多次元物理データ取り扱いライブラリー。 DCPAM が出力する NetCDF形式のデータを可視化するために用いる。 公式サイトはこちら。
Docker Desktop のサイト の「Docker Desktopをダウンロードする」の中から「Mac 版をダウンロード - Apple Silicon」をクリックする。 ダウンロードされた .dmg ファイルを開き、画面の指示に従ってアイコンをドラッグ&ドロップでインストール完了。
Homebrew がインストール済みの場合は
brew install --cask docker
でインストール可能。
Mac 用の X11 について
「X11 は Mac に付属しなくなりましたが、X11 のサーバとクライアントのライブラリは、XQuartz プロジェクトから入手できます。」
ということで、
XQuartz プロジェクトから XQuartz-2.8.5.pkg
をダウンロードして開き、画面の表示に従ってインストールする。
Homebrew がインストール済みの場合は
brew install --cask xquartz
でインストール可能。
open -a XQuartz
などでXQuartzを起動し、
設定 > セキュリティ >「接続を認証」「ネットワーク・クライアントからの接続を許可」
のチェックボックスにチェックをいれる。
また、.zshrc
に以下を追加する。
export PATH="/usr/X11/bin:$PATH"
/usr/X11/bin/xhost + localhost
arm64アーキテクチャCPUの Apple Silicon で x86_64用 Debian を動かすという半ば強引な方法を実現するため、 Apple が提供するrosetta2というエミュレーション機能を用いる。
アーキテクチャを切り替えて実行するコマンド
arch -x86_64 zsh
を実行する。エラーが出る場合は rosetta2 が使えない状態なので、以下のコマンドを実行する。
"sudo softwareupdate --install-rosetta"
適当なディレクトリ (~/gphys など) を用意し、 Debian に Gphys をインストールするためのコードを書いた Dockerfile を配置し、 以下のコマンドを実行する。
FROM debian:bookworm
RUN apt-get update && apt-get upgrade -y && apt-get install -y debian-keyring ca-certificates wget netcdf-bin
# 公開鍵署名 ~ Gphys インストール
RUN echo 'deb http://www.gfd-dennou.org/library/cc-env/Linux/debian-dennou bookworm main \n\
deb-src http://www.gfd-dennou.org/library/cc-env/Linux/debian-dennou bookworm main \n ' >>/etc/apt/sources.list \
&& gpg --keyring /usr/share/keyrings/debian-maintainers.gpg --export -a 891D7E07 | tee /etc/apt/trusted.gpg.d/debian-dennou.asc \
&& apt-get update \
&& apt-get install -y gphys \
&& rm -rf /var/lib/apt/lists/*
# gphys irb 初期設定
RUN wget -P ~/ https://ruby.gfd-dennou.org//products/gphys/tutorial2/irbrc_ggraph.rb \
&& echo 'require "~/irbrc_ggraph.rb"' > ~/.irbrc
# サンプルデータダウンロード
RUN wget -P ~/sample https://ruby.gfd-dennou.org//products/gphys/tutorial2/air.2012-01.nc \
; wget -P ~/sample https://ruby.gfd-dennou.org//products/gphys/tutorial2/hgt.2012-01.nc \
; wget -P ~/sample https://ruby.gfd-dennou.org//products/gphys/tutorial2/ncep2.Jan.clim.1981-2010.nc
docker image build \
--platform linux/amd64
--tag gphys:1.5.6 \
-f ~/gphys/Dockerfile ~/gphys
これにより、Gphys がインストールされた x86_64用 Debian のイメージが gphys:1.5.6
という名前で保存される。
Dockerコンテナ内のデータはそのままでは他のコンテナに引き継ぐことができず、コンテナ削除のたびに作業データも消えてしまう。 そこで、ボリュームと呼ばれるストレージをコンテナ内の適当なディレクトリにマウントすることで、これを回避したい。 ここでは、その前段階としてボリュームを作成するコマンドを実行する。
docker volume create --name gphys-work
これにより、gphys-work
という名前のボリュームが作成される。
作成したボリューム一覧は、
docker volume ls
により確認できる。
また、コンテナにホストマシン上に存在するディレクトリをマウントする方法もあるので、 「Docker バインドマウント」などと検索し バインド マウント(bind mount) の使用 - Docker ドキュメント などといったページを参照するといい。
docker container run
コマンドにより、コンテナの作成〜起動までが行われる。
docker container run \
-it --rm \
--name gphys_work \
--env DISPLAY="host.docker.internal:0.0" \
--volume gphys-work:/root/work \
gphys:1.5.6
これにより gphys_work という名前のコンテナが立ち上がり、カレントシェルでコンテナのシェルが立ち上がる。
コンテナを停止するときは、ログアウトする時と同様にしてコンテナ内のbashを終了すればいい。
起動時に --rm
オプションを用いていた場合、
コンテナ停止と同時にコンテナは削除される。
--rm
を使用しなかった場合は、
exit
でコンテナは停止するが削除はされないので、
docker container rm gphys_work
で削除する必要がある。
一度停止したコンテナを再び起動する際は、
docker container start gphys_work \
してから
docker container exec -it gphys_work bash
することで先程と同様にコンテナを立ち上げることができる。
/root/sample
に
GPhys,GGraphチュートリアル
のサンプルデータがダウンロードされている。
また、コンテナ内で irb
を実行した際、自動的に
GPhys,GGraphチュートリアル
のirb用スタートアップファイル irbrc_ggraph.rb
が読み込まれるようになっている。
docker container run
で --detach
オプションを利用し
バックグラウンドでコンテナを起動した場合は、docker container exec -it [container name] bash
でコンテナのbashを操作できる。
apt install <ライブラリ名>
を実行する必要がある。Dockerfile
に
RUN apt-get install <ライブラリ名>
を書き足した上でイメージを作成し直すことでライブラリを追加できる。
gpview
などを実行したとき、
*** MESSAGE (SWDOPN) *** GRPH1 : STARTED / IWS = 1.
(ruby:10): Gtk-WARNING **: 16:20:32.312: cannot open display: host.docker.internal:0.0
というようなエラーが出る場合は、XQuartz が起動していない可能性があるので確認するといい。Authorization required, but no authorization protocol specified
という文章がある場合は、ホスト上でxhost + localhost
を行うと解決する可能性がある。