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

时间:2017-03-29 19:21:30

标签: node.js docker dockerfile

我尝试从node js图片创建容器,并且我已按照所示配置了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运行监视\":$ $中找不到可执行文件PATH"

2 个答案:

答案 0 :(得分:4)

如果您使用ENTRYPOINT的列表表示法,即使用[括号],则必须正确分隔参数。

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

现在它正试图找到一个名为" npm run watch"的文件。那不存在。

答案 1 :(得分:3)

ENTRYPOINT [ "npm run watch" ]

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

使用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

对于在this blog post中描述的Dockerfile中使用卷定义,我有强烈的意见。简而言之,您可以在docker-compose.yml中更好地定义卷,您可以使用Dockerfile创建匿名卷,如果您希望以后能够轻松地重用它们,则需要在其他地方重新定义。 / p>