如何在 docker 容器上设置 chrome 沙箱?

How to setup chrome sandbox on docker container?

我正在尝试 运行 chrome 在 docker 容器上,但我无法正确设置 chrome-sandbox 并且在我搜索人员的每个地方通过传递 --no-sandbox 告诉您仅禁用沙盒。我觉得这是来自“运行 作为 root”的同一个团队的解决方法。这是我的 docker 文件:

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,它不会崩溃。

这是因为 docker 的默认 seccomp 策略拒绝访问 chrome 正确设置沙箱所需的系统调用,从而导致“不允许操作”错误,它们是:克隆、取消共享、arch_prctl、chroot 和 ptrace。

扩展 default 策略以将这些系统调用添加到允许列表,这是与默认值的区别:

{
    "syscalls": [
        {
            "names": [
                "clone",
                "unshare",
                "arch_prctl",
                "chroot",
                "ptrace"
            ]
        }
    ]
]

并将 json 文件传递​​给 docker run--security-opt seccomp=file.json 参数或撰写文件中的相应参数:

version: "3.9"

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