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
@jack89roberts;
xhost +localhost
also seems to work, and is less reliant on a static host ip address.Thanks @paul-krohn for the write-up. I also found (after lots of trial and error) that I did not need to set the DISPLAY variable on the host, and the default value on my system
/private/tmp/com.apple.launchd.zEK89jAgFe/org.macports:0
worked okay.