Docker:ENTRYPOINT无法执行命令,因为它找不到该文件

我想从node js图像创build一个容器,我已经configuration了我的Dockerfile ,如下所示:

 FROM node:boron # Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Install app dependencies COPY package.json /usr/src/app RUN npm install # Bundle app source COPY . /usr/src/app VOLUME ./:/usr/src/app ENTRYPOINT [ "npm run watch" ] 

package.json我有一个名为watch的脚本,比运行名为watch-less的gulp任务要好。

如果我在我的本地环境中运行npm run watch ,该命令可以工作,但是当我尝试运行容器时,它不会显示下一个错误:

docker:来自守护进程的错误响应:oci运行时错误:container_linux.go:247:启动容器进程导致“exec:\”npm run watch \“:在$ PATH中找不到可执行文件”。

 ENTRYPOINT [ "npm run watch" ] 

这是一个不正确的json语法,它正在寻找可执行文件npm run watch ,而不是npm参数runwatch的可执行文件npm

用json语法你需要分离每个参数。 您可以使用shell语法:

 ENTRYPOINT npm run watch 

或者你可以像更新json语法(假设npm安装在/usr/bin ):

 ENTRYPOINT [ "/usr/bin/npm", "run", "watch" ] 

您还有一个不正确的卷定义:

 VOLUME ./:/usr/src/app 

Dockerfiles不能指定卷被挂载到主机的方式,只能在特定的目录位置定义匿名卷。 像这样的语法:

 VOLUME /usr/src/app 

我对本博客文章中描述的Dockerfile内使用卷定义有强烈的意见。 简而言之,您可以在docker-compose.yml中更好地定义卷,如果您希望稍后可以轻松地重新使用它们,您可以使用Dockerfile来创build匿名卷,以便在其他位置重新定义它们。

如果使用ENTRYPOINT的列表符号,也就是用[括号] ,则必须正确分隔参数。

 ENTRYPOINT ["npm", "run", "watch"] 

现在它试图find一个名字叫做“ npm run watch ”的文件,而这个文件不存在。