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

标签 docker k6

作为负载测试的一部分,在 K6 中,我需要针对 AWS 进行身份验证,这需要生成 JWT token 。这需要各种本地模块; 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: Get https://request-promise?_k6=1: dial tcp: lookup request-promise on 127.0.0.11:53: read 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: Get https://bluebird?_k6=1: dial tcp: lookup bluebird on 127.0.0.11:53: no such host



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

非常感谢。

最佳答案

恐怕现在不容易解决。你遇到了两个问题。两者都源于 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';找不到 request-promise在 Node.js 的常见位置。当 k6 在本地磁盘上找不到依赖项时,它会尝试通过网络检索它,从而导致出现“dial tcp: no such host”错误。

future 可能会有更多的 Node.js 兼容性,主要围绕依赖解析 (https://github.com/loadimpact/k6/issues/475),但目前使用 Node.js 库而不是更通用的库仍然有些棘手。

关于docker - 本地模块未通过 K6 中的 Docker 挂载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48586177/

相关文章:

git - 在气隙环境中使用 docker 的最佳实践

kubernetes - k6: k6 --out json - 打开 ./test.json: 权限被拒绝

docker - K6 InfluxDB + Grafana Docker:如何预加载仪表板

php - Docker - NGINX 容器转发到 PHP-FPM 容器

shell - 检测docker是否在同一脚本中成功运行

javascript - 是否可以将调试器附加到 k6 脚本?

load-testing - 使用 k6 测试 graphql 订阅

javascript - 使用 k6 进行 Meteor 应用程序负载测试,等待 body 元素

django - Docker:如何依赖本地数据库而不是数据库 docker 容器?

caching - 如何使用 Varnish 缓存发布请求?