如何从 docker 容器中运行 fIrefox

问题描述 投票:0回答:3

我正在尝试创建一个

docker
容器,让我运行
firefox
,这样我最终就可以使用
jupyter notebook
。现在,虽然我已经成功安装了
firefox
,但是我无法打开窗口。

按照 running-gui-apps-within-docker 的说明,我使用

Firefox
创建了一个图像(即“样本”),然后尝试使用

运行它
$ docker run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --net=host sample

当我这样做时,我收到以下错误:

root@machine:~# firefox
No protocol specified
Unable to init server: Could not connect: Connection refused
Error: cannot open display: :1

使用

man docker run
来理解标志,我无法找到
--net
标志,尽管我确实看到了
--network
标志。然而,用
--net
替换
--network
并没有改变任何东西。如何指定一个协议,让我创建一个可以在其容器中运行的映像
firefox

PS - 就其价值而言,当我检查 DISPLAY 的值时,我得到了可预测的结果:

~# echo $DISPLAY
:1
docker firefox x11
3个回答
2
投票

我已经在 docker 中运行 firefox 有一段时间了,所以这是可能的。关于安全方面,我认为以下是相关部分:

建筑

构建需要将 uid/gid 值与运行容器的用户进行匹配。我使用

UID
GID
构建参数来做到这一点:

Dockerfile

...
FROM fedora:35 as runtime

ENV DISPLAY=:0

# uid and gid in container needs to match host owner of
# /tmp/.docker.xauth, so they must be passed as build arguments.
ARG UID
ARG GID

RUN \
       groupadd -g ${GID} firefox && \
       useradd --create-home --uid ${UID} --gid ${GID} --comment="Firefox User" firefox && \
       true
...

ENTRYPOINT [ "/entrypoint.sh" ]

生成文件

build:
        docker pull $$(awk '/^FROM/{print $$2}' Dockerfile | sort -u)
        docker build \
                -t $(USER)/firefox:latest \
                -t $(USER)/firefox:`date +%Y-%m-%d_%H-%M` \
                --build-arg UID=`id -u` \
                --build-arg GID=`id -g` \
                .

入口点.sh

#!/bin/sh

# Assumes you have run
#      pactl load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1
# on the host system.
PULSE_SERVER=tcp:127.0.0.1:4713
export PULSE_SERVER

if [ "$1" = /bin/bash ]
then
        exec "$@"
fi

exec /usr/local/bin/su-exec firefox:firefox \
        /usr/bin/xterm \
                -geometry 160x15 \
                /usr/bin/firefox --no-remote "$@"

所以我以专用的非root用户身份运行firefox,并通过xterm将其包装起来,这样如果firefox意外退出或想要重新启动,容器就不会死掉。拥有所有这些额外的 xterm 窗口有点烦人,但我还没有找到任何其他方法来防止意外丢失

.mozilla
目录内容(映射到一个卷将阻止运行我绝对想要的多个独立的 docker 实例,并且另外,从隐私的角度来看,我希望不拖拉很长的历史记录。每当我确实想保存某些内容时,我都会复制
.mozilla
目录并将其保存在主机上(稍后在新容器中恢复)。 )).

跑步

运行.sh

#!/bin/bash

export XSOCK=/tmp/.X11-unix
export XAUTH=/tmp/.docker.xauth

touch ${XAUTH}
xauth nlist ${DISPLAY} | sed -e 's/^..../ffff/' | uniq | xauth -f ${XAUTH} nmerge -

DISPLAY2=$(echo $DISPLAY | sed s/localhost//)
if [ $DISPLAY2 != $DISPLAY ]
then
        export DISPLAY=$DISPLAY2
        xauth nlist ${DISPLAY} | sed -e 's/^..../ffff/' | uniq | xauth -f ${XAUTH} nmerge -
fi

ARGS=$(echo $@ | sed 's/[^a-zA-Z0-9_.-]//g')

docker run -ti --rm \
        --user root \
        --name firefox-"$ARGS" \
        --network=host \
        --memory "16g" --shm-size "1g" \
        --mount "type=bind,target=/home/firefox/Downloads,src=$HOME/firefox_downloads" \
        -v ${XSOCK}:${XSOCK} \
        -v ${XAUTH}:${XAUTH} \
        -e XAUTHORITY=${XAUTH} \
        -e DISPLAY=${DISPLAY} \
        ${USER}/firefox "$@"

有了这个,您可以运行

./run.sh https://stackoverflow.com/
并获得一个名为
firefox-httpsstackoverflow.com
的容器。如果您想登录到您的银行,与所有其他 Firefox 实例完全隔离(受操作系统进程边界保护,而不仅仅是某些内部浏览器隔离),您可以运行
./run.sh https://yourbank.example.com/


0
投票

尝试在 docker 主机中运行

xhost +
以允许与 X 服务器连接。


0
投票

2024 年,我还想在 Docker 中做一些事情,从运行 Firefox 开始。我正准备着手创建自己的 DockerFile 来设置 Firefox 和 VNC,但幸运的是发现Jocelyn Le Sage 已经使用 Linux、Firefox 和 VNC 创建了一个非常流行的 Docker 镜像。它满足了我目前为止的所有需求,让我能够快速上手。 (甚至不需要 VNC 客户端)。

DockerHub 镜像: jlesage/firefox

GitHub 项目: jlesage/docker-firefox

我不是专家,但它的 DockerFile 看起来具有工业实力和高品质。图像保持最新。该图像在 GitHub 上有极其的详细记录。

要运行它,我唯一要做的就是为容器化的 Firefox 创建一个本地目录来存储其配置文件。将此目录作为启动命令中的

-v
参数传递。

启动命令:

docker run -d \
  --name=firefox \
  -p 5800:5800 \
  -v /local/path/to/dir/for/firefox:/config:rw \
  jlesage/firefox

从我的浏览器访问容器化的 Firefox,网址为:

localhost:5800
© www.soinside.com 2019 - 2024. All rights reserved.