MacでPythonのGUIライブラリが使用可能なDockerをDockerfileにしてみた

先日書いたエントリ『JupyterlabからTkinterを使える!PythonのTkinterをDocker Container内のJupyterlabから稼働させる方法』で、Docker Container内でJupyterlabにTkinterをインポートするPythonプログラムを書いて実行したらホスト(自分のPC)側にGUIアプリが表示できるDocker Imageを構築することができました。

で、よくよく考えると、このエントリでまとめたContainerでの構築手順はDockerfileにしても問題がないではないか!と気付いてしまった。構築したContainer(PythonからJupyterlabまでインストールした)を一度Docker Imageにして(commitして)、そのDocker Imageから新たにContainerを作成もした上で、動作確認も済んでいるので。

ということで、新たな挑戦としてDockerfileを書いて、DockerfileからDocker Imageを作成することにします。が、新たな課題も見つかりました。



目次



Dockerfileを書く

今回書いたDockerfileは以下の通りである。

FROM ubuntu:latest

LABEL version="1.0" \
maintainer="eszett design" \
description="Dockerで構築したJupyterlabからPython TKinterを操作できるDocker imageとContainerを作成"

RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
libx11-dev \
python3-tk

RUN pip3 install jupyterlab

細かいことを言うと、CMDが書いていないが、今回は上手く書けず、動かなかったので省略します。

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

LABELは、ご覧いただいた通りDockerfileに関する情報を書きます。
自分はこのDockerfileのバージョンと作成者、説明を書き込みました。

RUNには今回インストールするものを書きます。
python3からjupyterlabまで、前エントリでインストールしたものです。



Dockerfileの保存先を確認

TerminalでDockerfileを指定するとき、Dockerfileのあるディレクトリが必要になるので、保存先を決めてディレクトリを確認する。

例えば、デスクトップ上に「test」という名の新規フォルダにDockerfileを格納した場合、Dockerfileのディレクトリは「~/Desktop/test」になります。



TeminalでDockerfileのあるディレクトリに移動

Teminalで

$ cd 「Dockerfileが存在するディレクトリ」

と入力しDockerfileのあるディレクトリに移動します。

前項の例ですと、

$ cd ~/Desktop/test

となります。



TeminalでDocker buildしてDocker Imageを作成

Teminalで

$ docker build -t 「Docker Image名」 「Dockerfileが存在するディレクトリ」

と入力しDocker Imageを作成します。

前項で既にDockerfileが存在するディレクトリに移動していますので、上記に入るのは「.」(ピリオド)になります。「.」(ピリオド)はカレントディレクトリ(今いるそのディレクトリ)を意味します。

「Dockerイメージ名」は任意に付けてください。ただし、名無しだと(<none>と表示されます。dangling状態と言います。)後々面倒なことが起こるそうなので必ず名付けましょう。

例えば、Docker Image名を「testimage」としますと、

$ docker build -t testimage .

となります。



python3-tkがインストールできない問題と再build

python3-tkのインストール途中でTerminalが進まなくなりました。

原因は、途中で地域名と都市名を尋ねてくる箇所です。

地域名を答えてもTerminalの反応はなく、待てど暮らせど一向に動かない状態になります。

この状態を回避する方法はあると思いますが、それについては後で調べることにして(分かり次第このエントリに追記します)、Dockerfileからpython3-tkを削除し、再度Docker buildします。

2020.10.12追記:

ENV DEBIAN_FRONTEND=noninteractive

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

すると無事にDocker Imageが作成されました。

作成されたDocker Imageがあるかを確認するには、Terminalに

$ docker images

と打ち込むと、Docker Imageの一覧が現れますので、先ほど名付けたものがあれば成功です。



Containerの作成

実行するに当たって、まず皆さんのMacのIPアドレスを調べてください
アップルメニュー→システム環境設定→ネットワークのウインドウ内にIPアドレスが小さな文字で書かれていると思います。
あとでコピペします。

Terminalに以下のコマンドを入力します。長いですが1行で書いてください。

$ docker run -e DISPLAY="皆さんのIPアドレス:0.0" -v ~/Desktop/work:/work -p 8888:8888 --name 新しいコンテナ名 イメージ名 jupyter lab --ip=0.0.0.0 --allow-root --NotebookApp.token=""

皆さんのIPアドレス」は、先程調べたものです。「新しいコンテナ名」は適宜つけてください。「イメージ名」は前々項で名付けた「Docker Image名」と同じです。

実行したら、Terminalで

$ docker ps -a

と打つと、作成されたContainerの一覧が出てきます。
該当するContainerのSTATUSが「Exited 〜」の場合、

$ docker restart コンテナ名またはID

でSTATUSを「Up 〜」にします。

また、XQuartzが立ち上がっているか確認してください。



python3-tkのインストール

Container作成後、先ほどDockerfileからインストールできなかったpython3-tkをContainerにインストールします。

Containerの中に入る

Terminalで

$ docker ps -a

と打つと、作成されたContainerの一覧が出てきます。
該当するContainerのSTATUSが「Exited 〜」の場合、

$ docker restart コンテナ名またはID

でSTATUSを「Up 〜」にします。

その後、Terminalに

$ docker exec -it コンテナ名 bash

と打ち、Containerの中に入ります。

Terminalの表示が、「root@コンテナID:/#」に変わります。これがContainerの中に入っている証拠になります。

python3-tkをContainerにインストール

Terminalに

# apt-get update

と入れ、Containerの中をアップデートします。
次に

# apt-get install python3-tk

と打ち、python3-tkをインストールします。

途中で、Terminal上に「〜[Y/n]〜」が出ていたら、「Y」と打ちreturnキーを押してください。
その後、地域一覧が出て来て現在の居住地域を尋ねてくるので、今お住いの地域の数字を入れreturnキーを押してください。
次に、現在の居住地に近い都市名(ほぼ首都名)が出てくるので、今お住いの地域近い都市の数字を入れreturnキーを押してください。インストールが進みます。
(以上は、日本に居住の場合、地域はAsia、都市はTokyoで良いと思います)

その後、前エントリ12および13を行い、問題なく稼働しましたら成功です。



今後の課題

以下の3つになります。

  • Xauthorityの設定方法
  • python3-tkをDockerfileから直接インストールする方法
  • CMDの書き方









Comments

よく読まれている記事

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

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

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

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

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