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
参数run
和watch
的可执行文件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
”的文件,而这个文件不存在。