如果没有 `xhost +local:`,Chromium 不会在 docker 下启动

如果没有 `xhost +local:`,Chromium 不会在 docker 下启动
$ 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

或者使用chromiumseccomp配置文件(创建于 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

seccomp 配置文件取自这些 答案,这是描述它是如何创建的。

相关内容