首页 > 解决方案 > 在 Linux 上的 Docker 中查看交互式 Cypress 测试运行程序

问题描述

当赛普拉斯测试在 docker 容器中运行时,我试图以交互模式查看赛普拉斯。本文解释了如何在 Mac 上执行此操作 - https://www.cypress.io/blog/2019/05/02/run-cypress-with-a-single-docker-command/#Interactive-mode。但是在我的新 linux mint OS 安装上,我无法让它工作。

在文章之后,我设置了 -

$ IP=172.17.0.1
$ xhost + $IP
$ export DISPLAY=172.17.0.1:0

这是 Docker 默认桥接网络上我的本地主机上的 IP 地址。

这是我唯一的设置。接下来是运行容器的 docker 命令——

docker container run -it \
  -v $PWD:/e2e \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -w /e2e \
  -e DISPLAY \
  --entrypoint cypress \
  cypress/included:3.8.1 open --project .

唯一的区别是最新的图像和 'docker container run' 而不是已弃用的 'docker run ...'

它引出——

(赛普拉斯:16):Gtk-WARNING **:无法打开显示:172.17.0.1:0

现在文章确实警告这可能会出现 -

调试提示:如果 Cypress 显示错误 Gtk-WARNING **: cannot open display:... 确保 X11 服务器允许从 Docker 容器通过网络连接。在终端中运行 xhost 命令以查看它是否具有您之前使用 xhost + $IP 添加的 IP 地址。

当我跑步时——

$ xhost

它给 -

INET:罗斯-Aspire-TC-780

SI:本地用户:罗斯

我是一个爱好网络开发人员,没有太多系统管理员知识,所以我完全依赖这篇文章的工作。有谁知道如何让这个工作?

标签: linuxdockercypress

解决方案


tl;博士

docker run -it --rm \
    --network host \
    -v ~/.Xauthority:/root/.Xauthority:ro \
    -e DISPLAY \
    -v $PWD:/e2e \
    -w /e2e \
    --entrypoint '' \
    cypress/included \
    npx cypress open

要在容器中运行任何 GUI 应用程序,docker您必须了解 X Window System 的工作原理。X 使用客户端-服务器模型。X 服务器程序在具有图形显示的计算机上运行,​​并与各种客户端程序(X 客户端)进行通信。X 服务器充当用户和客户端程序的中间人,接受来自客户端程序的图形输出请求并将它们显示给用户(显示器),并接收用户输入(键盘、鼠标)并将其传输到客户端程序。

在 X 中,服务器运行在用户的计算机上,而客户端可能运行在远程机器上。这个术语颠倒了客户端-服务器系统的常见概念,客户端通常在用户的本地计算机上运行,​​而服务器在远程计算机上运行。X Window 术语认为X Window 程序处于所有活动的中心,即X Window 程序接受并响应来自应用程序以及来自用户的鼠标和键盘输入的请求。因此,应用程序(在远程计算机上)被视为 X Window 服务器程序的客户端。

因此,要在 docker 容器中运行 GUI 应用程序,您必须为其提供一种与主机上运行的 X 服务器通信的方法。一种方法是使用host网络 ( --network host)。在这种情况下,容器共享主机的网络命名空间。即容器的网络栈不与Docker主机隔离。特别是,容器可以连接到主机上运行的任何服务器。

此外,您必须让容器对 X 服务器进行身份验证。同样,实现此目的的一种方法是使用基于 cookie 的身份验证。为此,您必须~/.Xauthority与容器 ( --volume ~/.Xauthority:/root/.Xauthority:ro) 共享文件。

而且你必须告诉容器 X 服务器在哪里运行。为此,使用了DISPLAY变量。由于容器将有权访问主机的网络命名空间,因此您可以简单地将DISPLAY变量从主机传递到容器 ( --env DISPLAY)。

然后您需要确保测试可用于cypress( --volume $PWD:/e2e+ --workdir /e2e)。

此外,cypress/included将入口点设置为cypress run,因此要打开cypress您必须重置入口点 ( --entrypoint '') 并使用npx( npx cypress open),否则它将找不到您的项目文件。通常,您运行cypress位于./node_modules/.bin/cypress,但cypress在图像中解析为/usr/local/bin/cypressnpx使它cypress./node_modules目录运行。

在这种情况下不需要这样做,cypress run因为后者默认为当前目录。出于某种原因,如果全局安装,cypress open 则不会这样做。

像这样,

docker run -it --rm \
    --network host \
    -v ~/.Xauthority:/root/.Xauthority:ro \
    -e DISPLAY \
    -v $PWD:/e2e \
    -w /e2e \
    --entrypoint '' \
    cypress/included \
    npx cypress open

更多关于它的信息

PS如果你做任何内存密集型的事情,cypress(或者更确切地说chrome)可能会偶尔崩溃。这是因为默认情况下docker为共享内存分配 64 MB ( /dev/shm)。解决这个问题的一种方法是让容器访问主机的共享内存。换句话说,隔离 IPC 命名空间。这是通过传递来实现的--ipc=host。这不是特定于cypress. 什么崩溃基本上是chrome


推荐阅读