【发布时间】:2022-02-10 21:24:00
【问题描述】:
我在下面创建了简单的 Dockerfile:
FROM node:16.7.0
WORKDIR /app
COPY . .
RUN npm install
# ENTRYPOINT [ "npm" ]
CMD ["sh", "-c", "tail -f /dev/null"]
我添加了一个带有"tail -f /dev/null" 的cmd 行,以检查如果我在容器内发出npm test 会出现什么问题。
只要我在容器内运行npm test --> 它就会抛出错误
# npm test
> docker-jest@1.0.0 test
> jest --verbose
sh: 1: jest: not found
我的package.json
{
"name": "docker-jest",
"version": "1.0.0",
"description": "Package for Jest",
"scripts": {
"test": "jest --verbose"
},
"Dependencies": {
"@babel/node": "*",
"@babel/core": "*",
"@babel/preset-env": "*",
"babel-jest": "*",
"jest": "*"
},
"license": "ISC"
}
sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
sum.test.js
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
即使我禁用 CMD 并启用 ENTRYPOINT 并且在构建之后,如果我发出:
docker run -it <imagename> test
它抛出了同样的错误,我看到 npm install 正在安装,但找不到开玩笑 @/usr/local/lib/node_modules/ 因为我看到节点模块部署在容器内的 location/usr/local/lib/node_modules/ 中,如果我发出jest 上面写着jest not found。如果我在没有容器的情况下运行相同的程序,它可以正常工作。我的意思是在运行npm install and then npm run test 之后在命令行中。
谁能帮助我了解为什么会出现此错误以及如何修复它?
-----------更新-------------
Found the fix,这是因为我的包锁定文件损坏了。当我在没有 docker 的情况下在本地进行测试时,我以某种方式损坏了锁定文件,后来当我构建并尝试使用 docker 运行时,损坏的锁定文件导致了很多问题。所以我删除了它并再次通过 docker 运行......它按预期工作。
【问题讨论】:
-
对我来说效果很好,你确定你构建和运行正确的图像 ID 吗?因为一切对我来说都很好 Docker 版本 20.10.8,构建 3967b7d
-
奇怪的是,同样对你有用,而对我来说却不是,是的,我检查过,一切都是一样的。另一个奇怪的是,如果我在容器内运行
npm install -g jest,那么我就可以运行 jest。除了 docker build 命令期间的 npm install 。现在我不确定你是否可以在普通的 package.json 中运行global包。