【まとめ】MacでPythonのGUIライブラリが使えるDockerの設定方法

PythonのGUIライブラリをDocker Container内で稼働させたく模索して1週間、よもやカスタマイズしたDocker Imageを作成するどころかDockerfileやらDocker Composeやらを書くことになる日がこんなに早く来るとは思っても見ませんでした。

習うより慣れろ

この言葉、使い倒されてもはや陳腐化しているこの言葉、やはり真理を突いています。

この言葉の真意、それは「インプットしたら即座にアウトプットしろ」。

真意を理解できた、そんな1週間でした。



さて、

にてDocker Container内に構築したPythonとGUIライブラリを、Jupyterlabを介して稼働させる方法を模索してきました。

改めて、何をしたいか、何が必要か、をまとめ、こちらの環境もまとめてから、完成したDockerfileとDocker Composeを公開し、どのようにしたかを解説していきます。



目次



開発環境

環境は、

  • マシン:MacBook Pro
  • OS:macOS Catalina(10.15.7)
  • 仮想環境:Docker Desktop
  • エディタ:JupyterLab、Sublime Text

上記に追加で、予めXquartzの導入と設定が必要になります。
導入および設定の方法は、拙ブログの『1 MacにXQuartzをインストール』および『2 XQuartzの環境設定を開く』をご覧ください。



したいこと

  • PythonをDockerで動かしたい
  • Pythonは同じくDockerに導入したJupyterlabで編集したい
  • PythonのGUIライブラリもJupyterlabで編集したい
  • PythonのGUIライブラリの結果はMacのデスクトップ上に表示したい
  • Jupyterlabで編集したPythonファイルはMacのデスクトップ上に保存したい
  • これらを1操作でおこなうためのDockerfileとDocker Composeを作成したい

つまり、Python、PythonのGUIライブラリ、Jupyterlab、その他必要なものをDocker Imageに入れ込み、それからDocker Containerを作成し、JupyterlabでPythonプログラミングをし、GUIの結果をMacのデスクトップ上に表示し、作成したPythonファイルをMacのデスクトップ上に保存する。

そんなDocker ImageおよびDocker Containerを構築するためのDockerfileとDocker Composeを作成したいのです。



階層構造

ファイルのディレクトリは以下の通りです。

desktop
  └testフォルダ
       ├Docker Composeファイル
       ├Dockerfile
       └workフォルダ
          └pythonファイル(jupyterlabで作成・編集)


Dockerfileの解説

FROM ubuntu:latest
LABEL version="1.0" \
      maintainer="eszett design" \
      description="Dockerで構築したJupyterlabからPython TKinterを操作できるDocker imageとContainerを作成"
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
		python3 \
		python3-pip \
		libx11-dev \
		python3-tk
RUN pip3 install jupyterlab

解説は、拙ブログの『Dockerfileを書く』でしていますが、ここで再度解説します。

1行目:FROMにはベースとなるDocker Image名を書きます。ubuntuの公式Imageを使用しました。

2〜4行目:LABELは、Dockerfileの情報を書きます。Dockerfileのバージョンと作成者、説明を書き込みました。

6〜11行目:RUNは、今回インストールするものを書きます。
MacでPythonのGUIライブラリをDocker Container内のJupyterlabから稼働させる方法』でインストールしたものです。

CMDを書いていませんが、こちらはDocker Composeに書いています

なお、『python3-tkがインストールできない問題と再build』にて、python3-tkがインストールできないことを書きましたが、6行目

ENV DEBIAN_FRONTEND=noninteractive

を追加することで、途中で地域名と都市名を尋ねてくる箇所を無視してくれるようになりますので、これで無事インストールできるようになりました。



Docker Composeの解説

version: "3.8"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - DISPLAY=host.docker.internal:0.0
    volumes:
      - ./work:/work
    ports:
      - 8888:8888
    image: test:latest
    container_name: test
    command:
      jupyter lab
        --ip=0.0.0.0
        --allow-root
        --notebook-dir='/work'
        --NotebookApp.token=''

1行目:Composeのバージョンです。
'3'だけだと不具合が出るとか出ないとかという情報がありましたので、最新バージョンの'3.8'を指定しました。

2行目:必須です。
詳細は『Compose ファイル バージョン 3 リファレンス | Docker ドキュメント』をご覧ください。

3行目:必須ですが名前は任意です。
最初「jupyter」としましたが、ビルド時に警告が出ましたので、無難に参考サイトなどで使われる「web」にしました。

4〜6行目:ビルド時に必要なDockerfileの、Composeファイルから見たパスとファイル名を指定します。
前述の階層構造の通り、DockerfileはComposeファイルと同一階層にあるので、5行目contextは同一階層を表す「.」(ピリオド)を指定します。

7〜8行目:環境変数といいます。
これでContainer内でプログラムしたPythonのGUIを自分のPCで表示するために、自分のPCのIPアドレスを指定します。これを行うためにXquartzが必要になります。
自分のPCのIPアドレスを変数で指定する方法が見つからず苦戦しましたが、Docker for Macを使用していれば「host.docker.internal」で指定できるようになりました。

9〜10行目:自分のPC上の指定フォルダとContainer内のフォルダを接続します。
これにより、PythonファイルはContainer内で編集しつつ保存は自分のPC上の指定フォルダにされるようになります。

11〜12行目:自分のPCとContainerを接続します。
「自分のPC:Container」の順です。自分のPCは「8888」以外でも指定できます。

13行目:Containerを起動させるイメージの設定です。
Docker ComposeでDocker Imageを新規作成する場合、ここで「イメージ名:タグ名」を指定すると、新規作成されるDocker Imageにイメージ名とタグ名が付与できます。
検索すると、Docker Imageに名前が付けられないということが多く見受けられましたが、これでもう大丈夫です。
イメージ名を指定しないと、作成されたイメージは<none>となり、いわゆる「dangling」状態となります。

14行目:新規作成するContainer名を設定します。

15〜20行目:Dockerfileで指定するコマンドを上書きします。
今回はDockerfileでCMDをどう書いたら不明だったので、こちらで指定しました。
Jupyterlabを設定するコマンドになります。「 --notebook-dir='/work'」は、10行目の「:」の右側と同じ階層を指定します。「-NotebookApp.token=''」は、これがないと、ブラウザでJupyterlabにアクセスした時にTokenと呼ばれるものを入力するよう要求されますが、それを回避するものです。



その他、説明を省いた箇所は、現時点で自身詳細不明で理解しないまま記述しています。
まだまだ勉強不足です。



ImageとContainerの作成

これでようやく自動でImageとContainerの作成ができるようになりました。

作成方法は、まずTerminalからDocker Composeのある階層に移動します。自分の場合は、Docker Composeはデスクトップ上のtestフォルダ内にあるので、Terminalに

$ cd ~/Desktop/test

と打ち込みtestフォルダ内に移動します。

次に、

$ docker-compose up --build

と打ち込むと、ImageとContainerの作成に進みます。
数分で作成が完了しますので、ImageとContainerが作成されているかを確認します。

新規にTerminalを立ち上げて、

$ docker images

と打ち込むと、作成済みのImageの一覧が現れます。ここに指定した名前のImageがあれば作成成功です。

次に、Terminalに

$ docker ps -a

と打ち込むと、作成済みのContainerの一覧が現れます。ここに指定した名前のContainerがあれば作成成功です。



今後の課題

まだまだ知らないことだらけです。

  • Xauthorityの設定方法やセキュリティ上の問題
  • CMDの書き方
  • 詳細の理解

ここで少しインプットしようと、書籍を購入しました。

継続は力なり、です。



参考サイト










Comments

よく読まれている記事

CSSボタンでテキストを天地中央に揃えるとき、なぜボタン高と行高を一緒にするのか

FullCalendarの導入からカレンダー毎の色指定まで

FacebookページのフィードURLを取得しウォールを自サイトに表示

Bloggerテンプレートのちょっとしたカスタマイズのまとめ

document.write() 複数行の記述方法