헤드리스 Docker 컨테이너에서는 디스플레이를 열 수 없지만 호스트에서는 디스플레이를 열 수 있습니다.

헤드리스 Docker 컨테이너에서는 디스플레이를 열 수 없지만 호스트에서는 디스플레이를 열 수 있습니다.

저는 헤드리스 시스템에서 작업 중이며 디스플레이를 에뮬레이션하려고 합니다(특히 Blender를 사용하여 헤드리스 시스템에서 렌더링할 수 있지만 문제는 더 근본적입니다).

그래요로그인을 시뮬레이션하여 X 세션 생성DISPLAY=:8 glxinfo, SSH를 통해 원격 시스템에 연결하는 동안 호스트 시스템에서 실행할 수 있습니다. 불행히도 나는아니요당신이 할 수 있는 일은 그것을 도커 컨테이너 내부에서 실행시키는 것입니다.

컨테이너는 간단합니다.

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(시뮬레이션된 로그인의 출력 중 하나) 파일을 매핑하고 컨테이너 호스트 이름을 다음과 같이 변경하여 작동하게 만들 수 있었습니다.

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 전달(스택 오버플로에서).

관련 정보