本地模块未通过K6中的Docker挂载

时间:2018-02-02 15:44:50

标签: docker k6

作为我的负载测试的一部分,在K6中,我需要针对AWS进行身份验证,这需要生成JWT令牌。这需要各种本地模块; aws-sdk,crypto-js仅举几例。

它们位于标准./node_modules文件夹中。

我读到Docker最初并不了解本地目录,因此需要安装它们。

这是我目前用来实现此目的的命令:

docker-compose run -v $(pwd)/:/perf k6 run /perf/http_post.js

在我的http_post.js文件中,它有:

import requestPromise from 'request-promise';
http.get('https://google.com');

目前错误:

  

ERRO [0024] GoError:获取https://request-promise?_k6=1:拨打tcp:   查询请求 - 承诺在127.0.0.11:53:读取udp   127.0.0.1:55571->127.0.0.11:53:i / o timeout

如果删除导入,则可以。

然后,如果我将其更改为:

import requestPromise from '../node_modules/request-promise/lib/rp.js';

似乎缓解了这个问题,但随后出现了另一个类似的问题(我认为这取决于模块使用的子依赖项):

  

ERRO [0004] GoError:获取https://bluebird?_k6=1:拨打tcp:lookup   蓝鸟在127.0.0.11:53:没有这样的主持人

我该怎么做才能解决这个问题?理想情况下,我不想通过每个依赖项及其子项将模块位置转换为绝对路径。

非常感谢。

1 个答案:

答案 0 :(得分:0)

我担心现在不容易解决这个问题。你遇到了两个问题。两者都源于k6是Node.js的独特JS执行环境。

第一个是大多数情况下Node.js库在没有"browserified"的情况下无法直接导入,因为k6不支持核心Node.js API,但支持ES5和ES6标准库API(通过https://github.com/zloirock/core-js)。浏览后甚至无法使用许多Node.js库(在这种情况下,不支持HTTP使用的Node.js request API。)

第二,正如您所提到的,k6不支持Node.js使用的相同依赖解析算法(https://nodejs.org/docs/latest/api/modules.html#modules_all_together)。因此,导入语句import requestPromise from 'request-promise';将无法在Node.js的常用位置找到request-promise。当k6在本地磁盘上找不到依赖关系时,它会尝试通过网络检索它,导致那些“拨打tcp:没有这样的主机”错误。

未来可能会有更多的Node.js兼容性,主要是依赖于解析(https://github.com/loadimpact/k6/issues/475),但是现在使用Node.js库仍然有点棘手,而不是更普遍的。 / p>