当赛普拉斯测试在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容器运行”,而不是已弃用的“ docker run ...”
它引起-
(Cypress:16):Gtk-警告**:无法打开显示:172.17.0.1:0
现在,这篇文章确实警告可能会出现-
调试提示:如果Cypress显示错误Gtk-警告**:无法打开显示:...确保X11服务器允许通过Docker容器通过网络进行连接。在终端中运行xhost命令,查看它是否具有您先前使用xhost + $ IP添加的IP地址。
当我跑步时
$ xhost
它给 -
英特网:ross-Aspire-TC-780
SI:localuser:ross
我是一个业余网络开发人员,没有太多的系统管理员知识,所以我完全依靠这篇文章来工作。有人知道如何使它工作吗?
tl; dr
docker run -it --rm \
--network host \
-v ~/.Xauthority:/root/.Xauthority:ro \
-e DISPLAY \
-v $PWD:/e2e \
-w /e2e \
--entrypoint '' \
cypress/included \
npx cypress open
要在docker
容器中运行任何GUI应用程序,您必须了解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
为共享内存(/dev/shm
)分配了64 MB 。解决此问题的一种方法是使容器可以访问主机的共享内存。换句话说,取消隔离IPC名称空间。那是通过通过--ipc=host
。这不是特定于的cypress
。崩溃基本上是chrome
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句