gpt4 book ai didi

linux - 在Linux上的Docker中查看交互式Cypress测试运行器

转载 作者:行者123 更新时间:2023-12-02 18:01:54 24 4
gpt4 key购买 nike

当 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-WARNING **: cannot open display: 172.17.0.1:0


现在,这篇文章确实警告可能会出现这种情况-

Debugging tip: if Cypress shows an error Gtk-WARNING **: cannot open display:... make sure X11 server allows connections over the network from the Docker container. Run xhost command in the terminal to see if it has the IP address you have added previous with xhost + $IP.


当我运行时-
$ xhost
它给 -

INET:ross-Aspire-TC-780

SI:localuser:ross


我是一个业余网络开发人员,没有太多的系统管理员知识,所以我完全依靠这篇文章来工作。有人知道如何使它工作吗?

最佳答案

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

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

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

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

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

您必须告诉容器X服务器在哪里运行。为此,使用了 DISPLAY variable。由于容器将可以访问主机的网络 namespace ,因此您可以简单地将 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则不需要,因为后者是当前目录的 defaults。由于一个原因或另一个 cypress open doesn't do that(如果已全局安装)。

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

关于它的更多信息 here

P.S.如果您执行任何占用大量内存的操作, cypress(或更确切地说是 chrome)可能偶尔会崩溃。发生这种情况是因为默认情况下 docker为共享内存( /dev/shm)分配了64 MB。解决此问题的一种方法是授予容器访问主机共享内存的权限。换句话说,取消隔离IPC namespace 。这可以通过传递 --ipc=host来实现。那是 not something specific to cypress 。崩溃的基本上是 chrome

关于linux - 在Linux上的Docker中查看交互式Cypress测试运行器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59514234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com