当Cypress测试在docker容器中运行时,我试图以交互模式查看Cypress。本文介绍了如何在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
它给出-
INET:ross-Aspire-TC-780
SI:localuser:ross
我是一个业余网络开发人员,没有太多的系统管理员知识,所以我完全依靠这篇文章来工作。有人知道如何使它工作吗?
答案 0 :(得分:2)
@ x-yuri提供了很好的答案,它为我指出了解决问题的正确方向。
对于那些难以在Docker compose和Ubuntu上运行的人们,这里是我的docker-compose.yml的精简版。
关键属性为network_mode: host
。
首先运行xhost +local:
以确保设置了正确的权限。
version: '3'
services:
back-office-web-app:
build:
context: .
volumes:
- ../build:/usr/share/nginx/html
ports:
- 3000:80
e2e-tests:
image: cypress/included:4.8.0
working_dir: /e2e
entrypoint: cypress open --project /e2e
depends_on:
- back-office-web-app
network_mode: host
environment:
CYPRESS_VIDEO: 'false'
CYPRESS_BASE_URL: 'http://localhost:3000'
DISPLAY:
volumes:
- ./test/:/e2e
- ~/.Xauthority:/root/.Xauthority:rw
答案 1 :(得分:1)
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
variable。由于容器将可以访问主机的网络名称空间,因此您可以简单地将DISPLAY
变量从主机传递到容器(--env DISPLAY
)中。
然后,您需要确保测试可用于cypress
(--volume $PWD:/e2e
+ --workdir /e2e
)。
此外,cypress/included
将入口点设置为cypress run
,因此要打开cypress
,必须重置入口点(--entrypoint ''
),然后使用{{1} }(npx
),否则它将找不到您的项目文件。通常,您运行位于npx cypress open
的{{1}},但是图像中的cypress
解析为./node_modules/.bin/cypress
。 cypress
使其从/usr/local/bin/cypress
目录运行npx
。
在cypress
的情况下不需要,因为后者defaults到当前目录。如果是全局安装,则出于一个或另一个原因./node_modules
doesn't do that。
就这样
cypress run
here上的更多内容。
P.S。如果您执行任何占用大量内存的操作,则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
)可能会偶尔崩溃。发生这种情况是因为默认情况下,cypress
为共享内存(chrome
)分配了64 MB。解决此问题的一种方法是授予容器访问主机共享内存的权限。换句话说,取消隔离IPC名称空间。这可以通过传递docker
来实现。那就是not something specific to cypress
。崩溃的原因基本上是/dev/shm
。