我正在尝试在 docker 容器内运行 TestCafe 测试。
测试在没有容器的情况下在本地使用 runner 或 cli 正常工作。当我尝试在 docker 容器内运行时,出现此错误:
ERROR Cannot find the browser. "/bin/sh" is neither a known browser alias, nor a path to an executable file.
我使用 testcafe/testcafe 图像作为容器中的启动器,并使用 npm 安装其他包。据我从 docs 读到,testcafe 图像带有 chrome。 Dockerfile:
FROM testcafe/testcafe
USER root
WORKDIR /app
COPY package*.json .
RUN npm install --force --legacy-peer-deps --progress=false
CMD npm run testrunner # this is a command that i define in package.json
package.json
{
...
"main": "index.js",
"scripts": {
"cafe:prod:h:3": "npx testcafe 'chrome:headless' --concurrency 3 src/tests/masterdata",
"testrunner": "node runner.js"
},
...
"dependencies": {
"@aws-sdk/client-ssm": "^3.535.0",
"aws-sdk": "^2.1582.0",
"dotenv": "^16.4.5",
"downloads-folder": "^3.0.3",
"testcafe": "^3.5.0",
"testcafe-browser-tools": "^2.0.26"
}
}
runner.js
const createTestCafe = require('testcafe');
(async function () {
const testcafe = await createTestCafe();
try {
const runner = testcafe.createRunner();
const failed = await runner.src(['src/tests/masterdata']).browsers('chrome:headless').concurrency(3).run();
console.log('Tests failed: ' + failed);
} finally {
await testcafe.close();
}
})();
我没有在代码中的任何地方引用 /bin/sh 。为什么 testcafe 尝试从这条路径使用 docker?如何在容器内运行 runner.js?
错误消息和文档表明您使用的基本映像将 testcafe 工具声明为图像的
ENTRYPOINT
,这意味着 CMD
实际上不是命令,而只是 testcafe 的参数。如果 CMD
是一个字符串,那么 Docker 会自动将其包装在 /bin/sh -c '...'
中,这会导致您看到的特定错误。
如果您想以这种方式运行映像,则需要将 testcafe 参数从
package.json
复制到 Dockerfile 中。这将是 CMD
,即使它不是真正的“命令”,并且它必须使用不使用 shell 解释的 JSON 数组语法。不要忘记将测试也复制到图像中。
COPY src/tests/ src/tests/
CMD ["chrome:headless", "--concurrency", "3", "src/tests/masterdata"]
如果您想保留基础镜像捆绑的工具但运行您自己的命令,则需要覆盖基础镜像的
ENTRYPOINT
。一种选择是将其设置为空 JSON 数组,此时 CMD
恢复为正常命令。
COPY ./ ./
ENTRYPOINT []
CMD npm run testrunner