挂载docker-compose卷以重新加载代码时出错

时间:2019-03-03 00:13:19

标签: node.js docker docker-compose

我有一个简单的节点脚本,以及一个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。配置此的正确方法是什么?

1 个答案:

答案 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