👋

JupyterLab in DockerでPandasのto_clipboardを使えるようにしたった

2022/03/26に公開

概要

  • 今回,Docker for M1 Macで作ったJupyterLab環境でPandasのto_clipboardが動くようにしました.
  • to_clipboradが使えなくて困る場面はあまりないですが,エクセルにデータフレームを貼り付けたい時に結構役に立ちます.
  • to_clipboardがちゃんと動くまでの最も簡単な手順を残しています.(他にもっと良い方法があれば教えて下さい!)
  • 今回の内容は,Macの適用のみだと思います.

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

前提知識

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

試行環境とファイル構成

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

手順

手順概要

  1. XQuartzをMacにinstallして設定を行う
  2. Dockerfileを作成する
  3. init.shを作成する
  4. docker-compose.ymlを作成する
  5. コンテナをbuildする
  6. to_clipboardをJupyterLabで試しに動かしてみる

1. XQuartzをMacにinstallして設定を行う[1]


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 installxclipをインストールする[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してみると,うまく貼り付けできることが確認できる.

参考

脚注
  1. ぶっちゃけこの辺の仕組みあんまりわからないので,DockerでGUIを表示するときの仕組みについてとかを参考にしてください. ↩︎

  2. Dockerで作ったコンテナのOSはLinuxであり,Linuxでto_clipboardを使うには,xclipをインストールしろとpandas.DataFrame.to_clipboardに書いてありました. ↩︎

Discussion