$ xhost
access control enabled, only authorized clients can connect
xterm
作品:
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/root/.Xauthority:ro \
--env DISPLAY \
alpine:3.19 sh -euxc 'apk add xterm; exec xterm'
chromium
打开一个窗口,似乎收到击键,但窗口是空的(输出):
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/root/.Xauthority:ro \
--env DISPLAY \
alpine:3.19 sh -euxc 'apk add chromium; exec chromium --no-sandbox'
如果我允许本地连接,xhost
它就可以工作:
$ xhost +local:
$ xhost
access control enabled, only authorized clients can connect
LOCAL:
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/root/.Xauthority:ro \
--env DISPLAY \
alpine:3.19 sh -euxc 'apk add chromium; exec chromium --no-sandbox'
$ xhost -local:
人们可以在这里推测它启动了无权访问的非根进程/root/.Xauthority
,这就是它失败的原因。那么在哪个用户下呢?这样我就可以提供.Xauthority
给所有感兴趣的各方。我该如何调试这个?我该如何让它发挥作用?
答案1
chromium
不完全是一个答案,但在非 root 下运行可能更有意义:
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/.Xauthority:ro \
--env DISPLAY \
alpine:3.19 \
sh -euxc 'apk add chromium shadow
useradd -m a
cp .Xauthority /home/a
chown a: /home/a/.Xauthority
exec su - a -c "DISPLAY=\"$DISPLAY\" exec chromium --no-sandbox --no-first-run"'
或者更好(我假设你在 PID 1000 下运行):
Dockerfile
:
FROM alpine:3.19
RUN apk add chromium shadow && useradd -m a
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/home/a/.Xauthority:ro \
--env DISPLAY \
-u 1000 \
i chromium --no-sandbox --no-first-run
或者使用chromium
seccomp配置文件(创建于 2016 年),我们可以避免--no-sandbox
:
$ curl -O https://raw.githubusercontent.com/jessfraz/dotfiles/master/etc/docker/seccomp/chrome.json
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/home/a/.Xauthority:ro \
--env DISPLAY \
-u 1000 \
--security-opt seccomp=chrome.json \
i chromium --no-first-run