Node.js Docker compose找不到我的index.js

Node.js Docker compose找不到我的index.js,node.js,docker,docker-compose,Node.js,Docker,Docker Compose,我遵循并使用我的低级docker知识来建立和运行一个开发环境。我碰到了一堵无法解决的墙。这是我的docker compose.yml: version: '2' services: redis: image: redis:3.2 mongo: image: mongo:3.2 app: build: . ports: - '3000:3000' command: './node_modules/.bin/nodemon ./inde

我遵循并使用我的低级docker知识来建立和运行一个开发环境。我碰到了一堵无法解决的墙。这是我的
docker compose.yml

version: '2'
services:
  redis:
    image: redis:3.2
  mongo:
    image: mongo:3.2
  app:
    build: .
    ports:
      - '3000:3000'
    command: './node_modules/.bin/nodemon ./index.js'
    environment:
      NODE_ENV: development
    volumes:
      - .:/home/app/cardcreator
      - /home/app/cardcreator/node_modules
    depends_on:
      - redis
      - mongo
    links:
      - redis
      - mongo
这是我的
Dockerfile

FROM node:6.3.1

RUN useradd --user-group --create-home --shell /bin/false app

ENV HOME=/home/app

COPY package.json npm-shrinkwrap.json $HOME/cardcreator/
RUN chown -R app:app $HOME/*

USER app
WORKDIR $HOME/cardcreator
RUN npm install

USER root
COPY . $HOME/cardcreator/
RUN chown -R app:app $HOME/*
USER app

CMD ["node", "index.js"]
当我试图通过
docker compose up
启动应用程序时,出现了错误

app_1    |   Usage: nodemon [nodemon options] [script.js] [args]
app_1    |   See "nodemon --help" for more.
然后,我删除了我的
docker compose.yml
命令行,只留下
节点index.js
来启动。我收到一个错误,说找不到
index.js

该文件在我的项目文件夹中,它在那里并且有内容。我不明白为什么这个设置不起作用,我为尾巴做了类似的设置,效果很好

谁能告诉我我做错了什么吗?

你可以试着用

docker exec -it app_1 bash
要进入容器,请尝试执行

node index.js 

手动命令并查看发生了什么。但无法100%确定“节点”docker映像是否已安装bash

无论您在这里的compose文件中装载什么:

- .:/home/app/cardcreator
将安装在Dockerfile中内置的
$HOME/cardcreator/
之上


因此,基本上,您似乎有冲突的卷—这是一个操作顺序问题—构建将首先发生,而卷装载将在容器运行时发生,因此您的容器将不再能够访问Docker文件中构建的文件。

您运行的Docker版本和环境是什么?看起来您的卷装载没有按您预期的方式进行,这在Mac/Win内部运行Docker VM时很常见。@BMitch我确实在Windows 10上运行Docker 1.12。有什么建议吗?他们有,但由于Docker命令因错误而停止,容器立即停止,我无法在其上运行任何命令。你是对的,就是这样!但是我以前使用过这个配置选项,用于rails的东西,以避免每次更改文件时都需要重新构建整个应用程序。我猜出于某种原因我不能在这里这样做?你只需要设计你的目录结构,这样你想要更改的文件就不会与你在Dockerfile中构建的文件冲突。如果您构建Dockerfile,使更改的文件位于上次运行语句中,它将重用上面创建的任何层,因此重新构建应该非常快。您甚至可以在构建中运行测试来检查引入的错误。通常,没有理由在卷上存储node_模块。如果你愿意,你甚至可以链接到一个或两个文件,但如果整个应用程序都是不可变/自包含的,那就更好了。