There is a longstanding issue/missing feature/bug with sockets on Docker on macOS; it may never work; you'll need to use a network connection between Docker containers and X11 on macOS for the foreseeable future.
I started from this gist and made some adjustments:
- the volume mappings aren't relevant/used, due to the socket issue above.
- this method only allows X11 connections from your Mac, not the entire local network, which would include everyone on the café/airport WiFi.
- updated to include using the
host.docker.internal
name for the the container host, instead. - you have to restart XQuartz after the config change.
- you have a docker image with
x11-apps
(or the equivalent for not-ubuntu) installed - you have XQuartz installed (ie from Homebrew,
brew cask install xquartz
) and your PATH updated to include/opt/X11/bin
and/or/usr/X11/bin
.
- Launch XQuartz. Under the XQuartz menu, select Preferences
- Go to the security tab and ensure "Allow connections from network clients" is checked.
- Restart XQuartz.
- Make sure X11 is accepting connections from your host with
xhost +$(hostname).local
(if your Mac's name isSo-and-So's Computer
, you will need to do some fancy quoting and escaping). - Set your DISPLAY environment variable to
:0
, egexport DISPLAY=:0
. - Test it from your Mac with
xeyes
. - It works? Cool, one step fancier, from a container:
docker run --rm -e DISPLAY=host.docker.internal:0 -it some-container-name xeyes
Thanks, it works for me!
I have a question. The reason we decided to use Docker was to make our code works in different OS. But it seems we need to install and config display for each OS (Linux, Mac and Window). So Does it make sense to use Docker? How to manage this?