我尝试从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"
答案 0 :(得分:4)
如果您使用ENTRYPOINT
的列表表示法,即使用[
括号]
,则必须正确分隔参数。
ENTRYPOINT ["npm", "run", "watch"]
现在它正试图找到一个名为" npm run watch
"的文件。那不存在。
答案 1 :(得分:3)
ENTRYPOINT [ "npm run watch" ]
这是一个不正确的json语法,它正在寻找可执行文件npm run watch
,而不是带有参数npm
和run
的可执行文件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>