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

aba*_*edo 2 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" ]
Run Code Online (Sandbox Code Playgroud)

package.json我有一个名为watchthan的脚本中运行名为watch-less.

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

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

Dan*_*owe 5

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

ENTRYPOINT ["npm", "run", "watch"]
Run Code Online (Sandbox Code Playgroud)

现在它正试图找到一个字面上名为“ npm run watch”的文件,但该文件不存在。


BMi*_*tch 5

ENTRYPOINT [ "npm run watch" ]
Run Code Online (Sandbox Code Playgroud)

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

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

ENTRYPOINT npm run watch
Run Code Online (Sandbox Code Playgroud)

或者您可以更新 json 语法,例如(假设npm安装在 中/usr/bin):

ENTRYPOINT [ "/usr/bin/npm", "run", "watch" ]
Run Code Online (Sandbox Code Playgroud)

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

VOLUME ./:/usr/src/app
Run Code Online (Sandbox Code Playgroud)

Dockerfiles 无法指定卷如何挂载到主机,只能在特定目录位置定义匿名卷。使用如下语法:

VOLUME /usr/src/app
Run Code Online (Sandbox Code Playgroud)

我强烈反对在这篇博文中描述的 Dockerfile 中使用卷定义。简而言之,您可以在 docker-compose.yml 中更好地定义卷,使用 Dockerfile 所能做的就是创建匿名卷,如果您希望以后能够轻松地重用它们,您仍然需要在其他地方重新定义这些卷。