ヘッドレスDockerコンテナではディスプレイを開くことはできませんが、ホストではディスプレイを開くことができます。

ヘッドレスDockerコンテナではディスプレイを開くことはできませんが、ホストではディスプレイを開くことができます。

私はヘッドレスシステムで作業しており、ディスプレイをエミュレートしようとしています(特にBlenderを使用してヘッドレスシステムでレンダリングできますが、問題はより基本的です)。

はいログインをシミュレートしてXセッションを作成するDISPLAY=:8 glxinfo、SSH経由でリモートシステムに接続している間、ホストシステムで実行できます。残念ながら私いいえあなたができることは、それをDockerコンテナの内部で実行させることです。

コンテナは簡単です。

ARG CUDA_VERSION=11.4.2
ARG UBUNTU_VERSION=20.04

# Dev/deploy images build from the nvidia runtime
FROM nvidia/cudagl:${CUDA_VERSION}-runtime-ubuntu${UBUNTU_VERSION}

# Setup non-root user. 
# Note that the UID needs to match the UID of the external user!
ARG USER_UID=<external_user_uid>
ARG USER_GID=${USER_UID}
ARG USERNAME=<external_username>
ARG HOME=/home/${USERNAME}

# Avoid warnings by switching to noninteractive
ARG DEBIAN_FRONTEND=noninteractive

# Configure apt and install packages
RUN apt-get update \
    && apt-get -y upgrade \
    && apt-get -y install \
        # for demo
        mesa-utils\
    # nonroot
    && groupadd --gid ${USER_GID} ${USERNAME} \
    && useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} \
    # Clean up
    && apt-get autoremove -y \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*

USER ${USERNAME}

画像は次のように開始できます。

# gpus flag isn't needed for the demo, but is part of my actual deployment
docker run --rm --gpus all --mount "source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached" -e DISPLAY=${DISPLAY} reprocontainer glxinfo

これは私のローカル開発ボックス(実際にログインした場所)で正常に実行されますが、いいえSSHを介して接続されたリモートサーバーでは、次のように報告されます。

No protocol specified
Error: unable to open display :8

.Xauthority(シミュレートされたログインの出力の1つ)ファイルをマップし、コンテナのホスト名を次のように変更して機能させることができました。

docker run --rm -it --gpus=all --mount "source=/tmp/.X11-unix,target=/tmp/.X11-unix,type=bind,consistency=cached" -e DISPLAY=:8 -v "/home/<external_username>/.Xauthority:/home/<internal_username>/.Xauthority:rw" -u <internal_username> -h <external_hostname> glxinfo

これが機能している間、ヘッドレスセッションに追加のパラメータが必要であることはまだ混乱しています。私の考えでは、「実際の」ログインが追加/他のタスクを実行してこれを必要としないようですが、それが何であるかはわかりません。

...何を与えるか?私は何を見逃していますか?

ベストアンサー1

--net=host私の最初の本能は、正しい場所を指すようにコンテナにフラグを追加することです。これが役に立たない場合、おそらく解決策は私の能力ではないでしょう。しかし、おそらくより効率的な説明と解決策を提供することができます。Dockerで実行されるGUIアプリケーション用のX11配信(スタックオーバーフローで)。

おすすめ記事