$ 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