运行使用docker撰写节点容器时出错

在运行“docker-compose up”时,出现以下错误:

npm info lifecycle server@1.0.0~dev: server@1.0.0 > server@1.0.0 dev /code/app > nodemon -L ./bin/www --exec babel-node sh: 0: getcwd() failed: No such file or directory path.js:1144 cwd = process.cwd(); ^ Error: ENOENT: no such file or directory, uv_cwd at Error (native) at Object.resolve (path.js:1144:25) at Function.Module._resolveLookupPaths (module.js:361:17) at Function.Module._resolveFilename (module.js:431:31) at Function.Module._load (module.js:388:25) at Module.require (module.js:468:17) at require (internal/module.js:20:19) at Object.<anonymous> (/usr/local/lib/node_modules/nodemon/bin/nodemon.js:3:11) at Module._compile (module.js:541:32) at Object.Module._extensions..js (module.js:550:10) npm info lifecycle server@1.0.0~dev: Failed to exec dev script npm ERR! Linux 4.9.36-moby npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "dev" npm ERR! node v6.3.1 npm ERR! npm v3.10.3 npm ERR! code ELIFECYCLE npm ERR! server@1.0.0 dev: `nodemon -L ./bin/www --exec babel-node` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the server@1.0.0 dev script 'nodemon -L ./bin/www -- exec babel-node'. 

我的dockerfile看起来像这样:

 FROM joakimbeng/node-zeromq RUN mkdir /code/ RUN mkdir /code/app/ COPY package.json /code/ WORKDIR /code RUN npm install -g nodemon babel-cli RUN npm install WORKDIR /code/app CMD ["npm", "run", "dev"] 

而我的服务是这样的:

 node: build: ./node/ ports: - "3000:3000" volumes: - ../code:/code/app links: - mongodb - python environment: - NODE_ENV=dev - NODE_PATH=/code/node_modules - MONGODB_ADDRESS=mongodb - PYTHON_ADDRESS=python 

我试图删除所有的容器和图像,并再次运行整个事情,但同样的错误出现。 在运行“docker-compose build”时似乎很好。

我想在这里完成的是:1.让容器处理所有的依赖项(节点模块)2.将我的代码库安装到容器3.使用nodemon进行热重载

我结束了一些类似于我最初做的事情。 不知道是什么导致了我的OP中的错误,但差异似乎是我将我的依赖关系安装在不同的目录中。

Dockerfile:

 FROM joakimbeng/node-zeromq RUN mkdir /code/ RUN mkdir /dependencies/ COPY package.json /dependencies/ WORKDIR /dependencies/ RUN npm install -g nodemon babel-cli npm install WORKDIR /code/ CMD bash -c "npm run dev" 

docker服务 – 组成:

  node: build: ./node/ ports: - "3000:3000" volumes: - ../code/:/code links: - mongodb - python environment: - NODE_ENV=dev - NODE_PATH=/dependencies/node_modules - MONGODB_ADDRESS=mongodb - PYTHON_ADDRESS=python 

这样我的依赖关系只安装在build上。

您的问题是分享量。 当您从主机共享容器到容器时。 如果文件夹已经存在于容器中,那么主容器将会遮盖容器文件夹。

如果容器内有10个文件,主机上有0个文件,那么容量映射你的容器后会看到0个文件。 因为主机文件夹已被挂载,它什么也没有。 所以你Dockerfile语句

 RUN npm install 

如果主机卷没有完成npm安装,则实际上已经消失。 幸运的是,解决scheme很简单。 您可以将您的CMD更改为以下

 CMD bash -c "npm install && npm run dev" 

如果您不想更改Dockerfile ,则可以在Dockerfile docker-compose.yml文件中为node服务添加以下内容

 command: bash -c "npm install && npm run dev" 

编辑(14-Aug):

如果你想要你的依赖关系在图像中,那么你需要在你docker-compose.yml做一些改变,你需要的是内部代码被单独留下,只node_modules将该目录中的node_modules链接到你的app目录

 node: build: ./node/ ports: - "3000:3000" volumes: - ../code:/code/app command: bash -c "ln -fs /code/node_modules /code/app/node_modules && exec npm run dev" links: - mongodb - python environment: - NODE_ENV=dev - NODE_PATH=/code/node_modules - MONGODB_ADDRESS=mongodb - PYTHON_ADDRESS=python 

我注意到的另一点是,你运行package.json安装在/code并把你的代码/code/app可能是错误的,当你运行图像。 但是在上面提到的新的编辑中,这应该起作用