我需要使用一个图形应用程序,该应用程序在远程计算机(运行 Ubuntu 16.04)上的 docker 容器中运行,我可以通过 PuTTY 从运行 Xming 的本地 Windows 计算机访问该图形应用程序。
我设法以一种可以运行 xterm 的方式连接到远程主机(通过 PuTTY X11 选项...)并运行容器(添加.Xauthority
到配置文件并将容器显示映射到我的显示器)一度但不会有第二次。看来我需要使用的应用程序需要打开多个窗口,因此不起作用。
我使用以下脚本打开远程主机上的docker容器
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 container"
exit 1
fi
nvidia-smi > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "##########################################"
echo ""
echo "Nvidia Display driver not installed"
echo "You will not be able to run the CUDA container"
echo ""
echo "##########################################"
VAR_DRIVER="TRUE"
fi
VAR_CONTAINER=$1
VAR_ARCH=$(uname -i | sed 's/_/-/g')
VAR_NVLIB=$(ldconfig -p | grep libnvcuvid.so | grep -m 1 ${VAR_ARCH} | cut -d "=" -f2 | sed 's/>//g')
VAR_NVPATH=$(dirname ${VAR_NVLIB})
VAR_DOCKER_VOL="-v /dev/bus/usb:/dev/bus/usb -v /home/${USER}/.qnx/license:/root/.qnx/license -v ${PWD}/display/socket:/tmp/.X11-unix -v ${PWD}/display/Xauthority:/root/.Xauthority"
#if [ -z ${VAR_DRIVER} ]; then
# VAR_DOCKER_VOL=${VAR_DOCKER_VOL}" -v "${VAR_NVPATH}":/usr/lib/nvidia"
#fi
CONTAINER_DISPLAY="0"
CONTAINER_HOSTNAME="docker_host"
mkdir -p display/socket
touch display/Xauthority
DISPLAY_NUMBER=$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
AUTH_COOKIE=$(xauth list | grep "^$(hostname)/unix:${DISPLAY_NUMBER} " | awk '{print $3}')
xauth -f display/Xauthority add ${CONTAINER_HOSTNAME}/unix:${CONTAINER_DISPLAY} MIT-MAGIC-COOKIE-1 ${AUTH_COOKIE}
socat TCP4:localhost:60${DISPLAY_NUMBER} UNIX-LISTEN:display/socket/X${CONTAINER_DISPLAY} &
echo "Connecting docker display "${CONTAINER_HOSTNAME}":"${CONTAINER_DISPLAY}" to local display "$(hostname)":"${DISPLAY_NUMBER}
echo "Moving local Xauthority Cookie "${AUTH_COOKIE}" in "${PWD}"/display/Xauthority to /root/.Xauthority in docker container"
docker run -it --rm -e DISPLAY=:${CONTAINER_DISPLAY} \
${VAR_DOCKER_VOL} \
--hostname ${CONTAINER_HOSTNAME} \
--shm-size 2g \
--runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES='compute,graphics,utility,video' \
-e NVIDIA_REQUIRE_CUDA='cuda>=10.0 brand=tesla,driver>=384,driver<385 brand=tesla,driver>=410,driver<411' \
${VAR_CONTAINER} \
/bin/bash
rm -r display
我大致按照以下步骤进行在远程服务器上的 Docker 容器中运行图形应用程序。
尝试从 docker 中打开第二个 xterm 时出现的错误是
xterm: Xt error: Can't open display: :0