linux - 在 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:本地用户:罗斯
我是一个爱好网络开发人员,没有太多系统管理员知识,所以我完全依赖这篇文章的工作。有谁知道如何让这个工作?
解决方案
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/cypress
。npx
使它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
。
推荐阅读
- python - 生成离线工作的 Bokeh html 文件
- python - 使用 plotly 或 seaborn 创建坐标热图
- c# - Process.Start 打开多个选项卡
- selenium - 如何修复“无法读取 Browsermob-Proxy json”?
- python - 在python中以两个半圆弧的形式创建数据集
- python - Python kivy 文本到语音和 Popup 并行
- javascript - 更改标签 href 取决于 window.location.href
- python - 大查询 | 蟒蛇 | 从 BigQuery 表 VIEW 中导出数据
- python - 使用我当前的脚本绘制 Y 误差线
- ios - react-native IOS 发布方案上的 Travis 错误