如何在Docker容器中设置Chrome沙盒?

3

我正在尝试在Docker容器中运行Chrome浏览器,但我无法正确设置Chrome沙盒,并且在我搜索的每个地方,人们都建议通过传递--no-sandbox来禁用沙盒。我感觉这是“以root身份运行”的同一团队的解决方法。以下是我的Dockerfile:

FROM buster-slim

# install chrome
RUN adduser --system --group chrome
RUN apt-get update \
    && apt-get install -y --no-install-recommends wget \
    && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
    && apt install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb \
    && rm google-chrome-stable_current_amd64.deb \
    && chown root:root -R /opt/google/chrome/ \
    && chmod 755 -R /opt/google/chrome/ \
    && chmod 4755 -R /opt/google/chrome/chrome-sandbox

USER chrome
ENTRYPOINT ["google-chrome", "--headless", "--disable-gpu"]

但是它会因为非法指令错误而崩溃:

Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted
Failed to generate minidump.Illegal instruction (core dumped)

如果我传递--no-sandbox,它就不会崩溃。

1个回答

1
这是因为Docker默认的seccomp策略拒绝访问Chrome所需的系统调用,以正确设置沙箱,从而导致“操作不允许”错误,这些系统调用包括:clone、unshare、arch_prctl、chroot和ptrace。
默认策略扩展以将这些系统调用添加到允许列表中,以下是与默认值的差异:
{
    "syscalls": [
        {
            "names": [
                "clone",
                "unshare",
                "arch_prctl",
                "chroot",
                "ptrace"
            ]
        }
    ]
]

然后将json文件传递给docker run命令的--security-opt seccomp=file.json参数,或者在compose文件中对应的参数:

version: "3.9"

services:
  chrome:
    security_opt:
      - seccomp=file.json

请问您能提供一下参考资料,从哪里获取要添加的系统调用列表吗? - Michael Freidgeim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接