我有一个简单的节点脚本,以及一个Dockerfile和docker组成的定义:
app / package.json
{
"name": "puppeteer-scrape",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"nodemon": "^1.18.10",
},
"scripts": {
"start": "nodemon scrape.js"
}
}
app / Dockerfile
FROM node:8.11.3
RUN mkdir -p /app
WORKDIR /app
COPY ./package* /app/
RUN npm install
COPY ./*.js /app/
CMD ["npm", "start"]
docker-compose.yml
version: '3'
services:
app:
build: app
volumes:
- .:/app
我想配置docker-compose在更改应用程序时重新运行脚本。
official docker-compose tutorial建议使用上述的卷定义来实现此目的。但是,当我运行docker-compose up
时,我得到:
$ docker-compose up
app_1 | npm ERR! path /app/package.json
app_1 | npm ERR! code ENOENT
app_1 | npm ERR! errno -2
app_1 | npm ERR! syscall open
app_1 | npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
app_1 | npm ERR! enoent This is related to npm not being able to find a file.
app_1 | npm ERR! enoent
app_1 |
app_1 | npm ERR! A complete log of this run can be found in:
app_1 | npm ERR! /root/.npm/_logs/2019-03-02T23_54_53_560Z-debug.log
似乎应用目录正在运行,或者在复制应用之前正在调用npm start
。配置此的正确方法是什么?
答案 0 :(得分:1)
问题是路径不匹配:
npm start
目录(在容器内部)的app
; npm
希望将package.json
文件放在当前目录中,但是使用docker compose可以将其安装在应用程序目录中; package.json
文件位于主机的应用程序目录中,这意味着它将被放置在运行容器的/app/app
目录中。解决方案:将Dockerfile中的WORKDIR
更改为/app/app
或在app
中共享具有该卷定义的docker-compose.yml
本地目录
volumes:
- ./app:/app