devcontainer: use VirtualGL on mac hosts (#30090)

* Install virtualgl in a container

* Initialize virtualgl in bashrc

* Create virtual screen when starting

* Start vglclient on host

* Run Xvfb in separate tmux session to keep it running

* Add note about virtualGL in readme

* Add wget

* source vglrun

* Start xvfb only when forwarding x11

* Remove section about vglrun from readme

* HOST_DISPLAY implementation

* Add MOTD message instead of readme section
pull/30111/head
Kacper Rączy 2 years ago committed by GitHub
parent ba90bdf7d9
commit d15c2d951f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      .devcontainer/Dockerfile
  2. 23
      .devcontainer/container_post_create.sh
  3. 8
      .devcontainer/container_post_start.sh
  4. 18
      .devcontainer/host_setup.sh

@ -1,8 +1,13 @@
FROM ghcr.io/commaai/openpilot-base:latest FROM ghcr.io/commaai/openpilot-base:latest
RUN apt update && apt install -y vim net-tools usbutils htop ripgrep tmux RUN apt update && apt install -y vim net-tools usbutils htop ripgrep tmux wget mesa-utils xvfb libxtst6 libxv1 libglu1-mesa libegl1-mesa
RUN pip install ipython jupyter jupyterlab RUN pip install ipython jupyter jupyterlab
RUN cd /tmp && \
ARCH=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) && \
curl -L -o virtualgl.deb "https://downloads.sourceforge.net/project/virtualgl/3.1/virtualgl_3.1_$ARCH.deb" && \
dpkg -i virtualgl.deb
USER batman USER batman
RUN cd $HOME && \ RUN cd $HOME && \

@ -3,17 +3,34 @@
TARGET_USER=batman TARGET_USER=batman
source .devcontainer/.host/.env source .devcontainer/.host/.env
# override display flag for mac # override display flag for mac hosts
if [[ $HOST_OS == darwin ]]; then if [[ $HOST_OS == darwin ]]; then
echo "Setting up DISPLAY override for macOS..." echo "Setting up DISPLAY override for macOS..."
cat <<EOF >> /home/$TARGET_USER/.bashrc cat <<EOF >> /home/$TARGET_USER/.bashrc
if [ -n "\$DISPLAY" ]; then source .devcontainer/.host/.env
DISPLAY_NUM=\$(echo "\$DISPLAY" | awk -F: '{print \$NF}') if [ -n "\$HOST_DISPLAY" ]; then
DISPLAY_NUM=\$(echo "\$HOST_DISPLAY" | awk -F: '{print \$NF}')
export DISPLAY=host.docker.internal:\$DISPLAY_NUM export DISPLAY=host.docker.internal:\$DISPLAY_NUM
fi fi
EOF EOF
fi fi
# setup virtualgl for mac hosts
if [[ $HOST_OS == darwin ]]; then
echo "Setting up virtualgl for macOS..."
cat <<EOF >> /home/$TARGET_USER/.bashrc
if [ -n "\$HOST_DISPLAY" ]; then
export VGL_PORT=10000
export VGL_CLIENT=host.docker.internal
export VGL_COMPRESS=rgb
export VGL_DISPLAY=:99
export VGL_FPS=60
# prevent vglrun from running exec
alias exec=:; source vglrun :; unalias exec
fi
EOF
fi
# These lines are temporary, to remain backwards compatible with old devcontainers # These lines are temporary, to remain backwards compatible with old devcontainers
# that were running as root and therefore had their caches written as root # that were running as root and therefore had their caches written as root
sudo chown -R $TARGET_USER: /tmp/scons_cache sudo chown -R $TARGET_USER: /tmp/scons_cache

@ -1,7 +1,15 @@
#!/usr/bin/env bash #!/usr/bin/env bash
source .devcontainer/.host/.env
# setup safe directories for submodules # setup safe directories for submodules
SUBMODULE_DIRS=$(git config --file .gitmodules --get-regexp path | awk '{ print $2 }') SUBMODULE_DIRS=$(git config --file .gitmodules --get-regexp path | awk '{ print $2 }')
for DIR in $SUBMODULE_DIRS; do for DIR in $SUBMODULE_DIRS; do
git config --global --add safe.directory "$PWD/$DIR" git config --global --add safe.directory "$PWD/$DIR"
done done
# virtual display for virtualgl
if [[ "$HOST_OS" == "darwin" ]] && [[ -n "$HOST_DISPLAY" ]]; then
echo "Starting virtual display at :99 ..."
tmux new-session -d -s fakedisplay Xvfb :99 -screen 0 1920x1080x24
fi

@ -2,6 +2,7 @@
# pull base image # pull base image
if [[ -z $USE_LOCAL_IMAGE ]]; then if [[ -z $USE_LOCAL_IMAGE ]]; then
echo "Updating openpilot_base image if needed..."
docker pull ghcr.io/commaai/openpilot-base:latest docker pull ghcr.io/commaai/openpilot-base:latest
fi fi
@ -27,3 +28,20 @@ fi
HOST_INFO_FILE=".devcontainer/.host/.env" HOST_INFO_FILE=".devcontainer/.host/.env"
SYSTEM=$(uname -s | tr '[:upper:]' '[:lower:]') SYSTEM=$(uname -s | tr '[:upper:]' '[:lower:]')
echo "HOST_OS=\"$SYSTEM\"" > $HOST_INFO_FILE echo "HOST_OS=\"$SYSTEM\"" > $HOST_INFO_FILE
echo "HOST_DISPLAY=\"$DISPLAY\"" >> $HOST_INFO_FILE
# run virtualgl if macos
if [[ $SYSTEM == "darwin" ]]; then
echo
if [[ -f /opt/VirtualGL/bin/vglclient ]]; then
echo "Starting VirtualGL client at port 10000..."
VGL_LOG_FILE=".devcontainer/.host/.vgl/vglclient.log"
mkdir -p "$(dirname $VGL_LOG_FILE)"
/opt/VirtualGL/bin/vglclient -l "$VGL_LOG_FILE" -display "$DISPLAY" -port 10000 -detach
else
echo "VirtualGL not found. GUI tools may not work properly. Some GUI tools require OpenGL to work properly. To use them with XQuartz on mac, VirtualGL needs to be installed. To install it run:"
echo
echo " brew install --cask virtualgl"
echo
fi
fi

Loading…
Cancel
Save