こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- docker環境内でtkinterを用いたGUIアプリを実行したい!
【事前準備】Xサーバーの準備
Xサーバーとは、X Window System(X11)の一部で、GUIアプリケーションが画面にウィンドウを表示したり、入力デバイスからの操作を受け取るための「橋渡し」を行うソフトウェアです。
docker環境でTkinterを用いたGUIアプリを起動する場合、Xサーバーの準備が必要になります。
以下、お手元のOSに対応したXサーバーを準備しましょう。
【MacOS】XQuartzのインストール
XQuartz概要
XQuartzとは、X11を使用したGUIアプリケーションをmacOS上で実行できるようにするためのソフトウェアです。これにより、macOS専用に設計されていない多くのクロスプラットフォームアプリケーションが動作可能になります。
インストール
MacOSをお使いの方は、XQuartzをダウンロードしましょう。
環境設定
Quartzをインストールした後に起動し、[Preferences] > [Security]に進みます。
「Allow connections from network clients(ネットワーククライアントからの接続を許可する)」オプションにチェックが入っていることを必ず確認してください。
【Windows】VcXsrvのインストール
VcXsrv概要
VcXsrvは、Windows向けのフリーでオープンソースのXサーバーです。これにより、Windows上でX11(X Window System)を利用したアプリケーションを実行し、そのGUIを表示することが可能になります。LinuxやUNIX環境で使われるX11アプリケーションを、Windows上で操作したり表示したりするための「橋渡し」の役割を果たします。
インストール
Windowsをお使いの方は、VcXsrvをダウンロードしましょう。
環境設定
VcXsrvの「Security」タブで、「Allow connections from network clients(ネットワーククライアントからの接続を許可する)」オプションをチェックすることが重要です。
これにより、リモートのX11クライアントがVcXsrvに接続できるようになります。
ソースコードの作成
Tkinterのサンプルコードを実行するために、以下のディレクトリ構成でファイルを作成していきます。
- main.py
|
- dockerfile
|
- requirements.txt
main.py
Tkinterのサンプルコードを用意します。
import tkinter as tk
def run_gui():
root = tk.Tk()
root.title("Tkinter Docker App")
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()
root.mainloop()
if __name__ == "__main__":
run_gui()
dockerfile
dockerfileでは次のようなコードを利用します。
# Use an official Python runtime
FROM python:3.11
# Install Tkinter and X11 forwarding tools
RUN apt-get update && \
apt-get install -y python3-tk && \
apt-get clean && \
apt-get install -y x11-apps
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container
COPY . /app
# Upgrade pip and install the dependencies from requirements.txt
RUN pip install --upgrade pip && \
pip install --no-cache-dir -r requirements.txt
# Run the Tkinter app when the container launches
CMD ["python", "main.py"]
requirements.txt
必要に応じてrequirements.txtを準備します。サンプルとして以下を入力しましょう。
requests
GUIを表示
GUIを表示するまでの流れを解説します。
dockerビルド
以下のコードをもとにdockerをビルドしましょう。
docker build -t tkinter_app .
作業PCのIPアドレスを取得
XサーバーからGUIアプリを起動するためのIPアドレスを取得しましょう。
MacOSの場合
IPアドレスを取得します。
IP=$(/usr/sbin/ipconfig getifaddr en0)
IPアドレスを出力します。
echo "IP: $IP"
上記のIPアドレスを用いてXQuartzに接続します。
/opt/X11/bin/xhost + "$IP"
Windowsの場合
IPアドレスを取得します。
IP=$(ipconfig | findstr "IPv4" | findstr /V "127.0.0.1" | for /F "tokens=14 delims= " %i in ('findstr "IPv4"') do echo %i)
IPアドレスを出力します。
echo "IP: $IP"
上記のIPアドレスを用いてVcXsrvに接続します。
/opt/X11/bin/xhost + "$IP"
コンテナ起動・GUIアプリ実行
最後に以下のコードを実行してコンテナを起動し、Tkinerアプリを実行します。
docker run -u=$(id -u $USER):$(id -g $USER) -e DISPLAY=$IP:0 -v /tmp/.X11-unix:/tmp/.X11-unix:rw --rm -it tkinter_app
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら