Docker ENTRYPOINT / CMD找不到文件

这是令人困惑的。

我有这个简单的Dockerfile,它使用npm install将依赖项安装到node_modules中:

FROM node:7 RUN chmod -R 777 $(npm root -g) RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json . RUN npm install RUN npm install github:sumanjs/suman#rebase_branch COPY . . RUN (cd node_modules && ls -a) # 1 this logs expected stuff RUN (cd node_modules/suman && ls -a) # 2 this logs expected stuff CMD ["node","/usr/src/app/node_modules/suman/cli.js"] 

看起来很清楚,该文件在运行后在那里

 cd node_modules/suman && ls -a 

但由于某种原因我得到一个错误:

 module.js:472 throw err; ^ Error: Cannot find module '/usr/src/app/node_modules/suman/cli.js' at Function.Module._resolveFilename (module.js:470:15) at Function.Module._load (module.js:418:25) at Module.runMain (module.js:605:10) at run (bootstrap_node.js:427:7) at startup (bootstrap_node.js:151:9) at bootstrap_node.js:542:3 

如果我这样使用ENTRYPOINT:

 ENTRYPOINT ["/usr/src/app/node_modules/suman/cli.js"] 

(cli.js有一个hashbang)

我得到一个类似的错误:

 container_linux.go:262: starting container process caused "exec: \"/usr/src/app/node_modules/suman/cli.js\": stat /usr/src/app/node_modules/suman/cli.js: no such file or directory" docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "exec: \"/usr/src/app/node_modules/suman/cli.js\": stat /usr/src/app/node_modules/suman/cli.js: no such file or directory". ERRO[0001] error waiting for container: context canceled 

这对我来说很奇怪,现在我已经使用了Docker一段时间了,之前没有看到过类似的东西。 任何人都知道可能会是什么? 似乎很清楚,该文件丢失,但我不明白为什么会这样的生活。 尤其是考虑到我使用ls -a ,文件似乎存在。

为了certificate这一点,这是第二个ls -a命令的输出:

 Step 10/11 : RUN (cd node_modules/suman && ls -a) ---> Running in 0715d56e23a9 . .. .babelrc .npmignore .tscmultiwatch README.md cli cli.d.ts cli.js <<< dis my file config dist dts examples lib package.json scripts webpack.config.js 

多么奇怪。

哦该死的,所以在dockerbuild造步骤中,文件在那里,而且ls -a透露。

但是当我用docker运行时,我有这样的:

 docker run -v "${project_root}/node_modules":/usr/src/app --name ${container_name} ${image_tag} 

所以容器中的node_modules dir被来自没有suman目录的容器外部的node_modules覆盖。

我的坏家伙。