👋
JupyterLab in DockerでPandasのto_clipboardを使えるようにしたった
概要
- 今回,Docker for M1 Macで作ったJupyterLab環境でPandasのto_clipboardが動くようにしました.
- to_clipboradが使えなくて困る場面はあまりないですが,エクセルにデータフレームを貼り付けたい時に結構役に立ちます.
- to_clipboardがちゃんと動くまでの最も簡単な手順を残しています.(他にもっと良い方法があれば教えて下さい!)
- 今回の内容は,Macの適用のみだと思います.
全ファイルについては,以下をご確認ください.
前提知識
- 基本的なdockerコマンド, docker-composeコマンドの使い方
- JupyterLabの使い方
試行環境とファイル構成
- M1 MacBook Pro
- macOS Monterey 12.1
- Docker Desktop 4.6.0 (for Mac)
- ファイル構成
.
├── Dockerfile
├── init.sh
└── docker-compose.yml
手順
手順概要
- XQuartzをMacにinstallして設定を行う
- Dockerfileを作成する
- init.shを作成する
- docker-compose.ymlを作成する
- コンテナをbuildする
- to_clipboardをJupyterLabで試しに動かしてみる
[1]
1. XQuartzをMacにinstallして設定を行うDockerコンテナ内でxclipコマンドを使えるように,ホストにXQuartzをインストールして,設定をしていきます.
- Mac用のX Window SystemであるXQuartzをインストールする.
- インストールが終わってログアウトされたら,「Finder→アプリケーション→ユーティリティ→XQuartz」で起動し直す.
- 「XQuartz→環境設定→セキュリティ」でネットワーク・クライアントからの接続を許可にチェックを入れる.
2.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 \
xclip
# 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
RUN apt-get autoremove -y \
&& apt-get clean
WORKDIR /work
COPY init.sh /usr/bin
CMD ["/bin/bash", "/usr/bin/init.sh"]
-
apt-get install
でxclipをインストールする[2]
3. 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が立ち上がる
4. docker-compose.ymlを作成する
コンテナを立ち上げるのに必要なdocker-compose.yml
を書いていきます.
docker-compose.yml
docker-compose.yml
version: "3"
services:
notebook:
build:
context: .
dockerfile: Dockerfile
environment:
- DISPLAY=${HOST_NAME}:0
container_name: "jupyterlab"
ports:
- 8888:8888
restart: always
volumes:
- ./work:/work
- ~/.Xauthority:/root/.Xauthority
- コンテナ内の環境変数
DISPLAY
に<ホスト名>:0
を指定する(ホスト側のホスト名の取得等については後述する) - ホスト側の
~/.Xauthority
をコンテナ側のホームディレクトリにマウントする
5. コンテナをbuildする
Dockerコンテナをbuildできる環境もできたので,いよいよコンテナを立ち上げます.
- MacOSXのホスト名が,動的に変わらないように3つのホスト名を同じに設定する(何もいじってない人は大体HostNameが設定されていない)
$ sudo scutil --set ComputerName <ホスト名>
$ sudo scutil --set HostName <ホスト名>
$ sudo scutil --set LocalHostName <ホスト名>
- コンテナをbuildする前に
$ export HOST_NAME=$(hostname)
(コンテナにホスト名を渡すため) $ docker-compose up -d --build
- 立ち上がったら,ブラウザで
localhost:8888
にアクセスしてJupyterLabがうまく起動できているか確認する
6. to_clipboardをJupyterLabで試しに動かしてみる
JupyterLabが立ち上がったので,実際にpandas.to_clipboardがうまく動くか確かめます.
- LauncherでPython 3を選択する
- XQuartzアプリを「Finder→アプリケーション→ユーティリティ→XQuartz」で起動し直す.
- 適当にDataFrameを作って,to_clipboardしてみると,うまく貼り付けできることが確認できる.
参考
-
ぶっちゃけこの辺の仕組みあんまりわからないので,DockerでGUIを表示するときの仕組みについてとかを参考にしてください. ↩︎
-
Dockerで作ったコンテナのOSはLinuxであり,Linuxでto_clipboardを使うには,xclipをインストールしろとpandas.DataFrame.to_clipboardに書いてありました. ↩︎
Discussion