Docker環境は慣れると環境構築が楽で良いですが、画像を表示させようとするとちょっと面倒です。
ここでは、Dockerfileとdocker-compose.ymlを使った設定について記述します。
ubuntu22.04環境です。
VScodeのDocker拡張を入れておけば、ymlファイルを右クリックしてupを選ぶだけでコンテナができるので便利です。
Dockerfileの追加設定
# ディスプレイ関連の追加設定
# 環境変数の設定
ENV DISPLAY=host.docker.internal:0.0
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
RUN apt-get install dialog
RUN apt-get install -y --no-install-recommends tzdata python3-tk
RUN dpkg --configure -a
python3-tkをインストールするときに、地域などを対話的に聞かれるので周辺の対策をしています。RUNは&&でまとめてもOKです。
docker-compose.ymlの追加設定
volumesとenvironmentを追加
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
environment:
- DISPLAY
displayのアクセス権限設定
xhost コマンドは使わずに、コンテナから画像表示が可能でした。
xhost + # コンテナなど外部からアクセスするとき
xhost - # 元に戻してセキュアな状態にするとき
私の設定ファイルの全体像
一般ユーザーとして利用できるコンテナです。sudoが使えます。GPU対応、CUDAとかcuDNNとかほとんど気にせず使えるのがありがたい。
Dockerfile.
FROM nvcr.io/nvidia/tensorflow:24.02-tf2-py3
# apt-get のアップデーテトとopenCV関係のライブラリを導入
RUN apt-get update && apt-get upgrade -y && apt-get install -y libgl1-mesa-dev
# sudoができる一般ユーザーを作成
# sudoのインストールと設定用フォルダの作成 pオプションで上位フォルダがなくても作成
RUN apt-get update && apt-get install -y sudo && mkdir -p /etc/sudoers.d
ARG USERNAME=user
ARG GROUPNAME=user
ARG UID=1000
ARG GID=1000
ARG PASSWORD=user
# 以下で、ユーザーグループの作成、ユーザーを作成 m:ホーム作成 s:ログインシェル指定 g:グループ指定 G:補助グループ指定
# パスワードを設定し、sudoができるメンバーとして設定する。
RUN groupadd -g $GID $GROUPNAME && \
useradd -m -s /bin/bash -u $UID -g $GID -G sudo $USERNAME && \
echo $USERNAME:$PASSWORD | chpasswd && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# ディスプレイ関連の追加設定 管理者権限があるときに行うこと
# 環境変数の設定
ENV DISPLAY=host.docker.internal:0.0
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
RUN apt-get install dialog
RUN apt-get install -y --no-install-recommends tzdata python3-tk
RUN dpkg --configure -a
# 作成したユーザーに切り替える。以降の処理は一般ユーザーになる。
USER ${UID}
# ドット.カレントディレクトリを/codeにコピーする。ADDでコピーすることで、コンテナ内での編集がローカルにも反映される。
# コピーする際に所有権を変更している。
ADD --chown=$USERNAME:$GROUPNAME . /code
# WORKDIRで作業ディレクトリを指定。以降のpipなどはこの場所からの実行になる。
WORKDIR /code
# pythonのライブラリを設定する。
RUN pip install --upgrade pip && pip install -r requirements.txt
docker-compose.yml
version: '3'
services:
test:
build: .
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
ports:
- "8888:8888" #for jupyter notebook hostname to 0.0.0.0
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
- .:/code:cached # プロジェクトフォルダを/codeに割り当てる。
environment:
- DISPLAY
tty: true
お好みで
requirements.txt
jupyter
opencv-contrib-python
scikit-learn
matplotlib
Pillow
テストプログラム。同一フォルダにcat.jpgをおいて表示させてみる。
test.py
# import matplotlib # バックエンド設定しなくても動作した
# matplotlib.use('TkAgg') # または 'Qt5Agg' など、利用可能な対話型バックエンド
import matplotlib.pyplot as plt
from PIL import Image
# 画像を読み込んで表示
image = Image.open('cat.jpg')
plt.imshow(image)
plt.axis('off')
plt.show()