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

时间:2019-12-28 19:33:52

标签: linux docker cypress

当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

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

2 个答案:

答案 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/cypresscypress使其从/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