$ 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
정확한 대답은 아니지만 루트가 아닌 사용자에서 실행하는 것이 더 합리적일 수 있습니다.
$ 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