4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker環境でディスプレイに画像を表示する

Last updated at Posted at 2024-05-13

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()
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?