Node.js Docker/bin/bash:nodemon:未找到命令

Node.js Docker/bin/bash:nodemon:未找到命令,node.js,docker,makefile,docker-compose,nodemon,Node.js,Docker,Makefile,Docker Compose,Nodemon,我试图将我的工作节点代码从主机装载到docker容器中,并使用docker compose使用nodemon运行它。 但容器似乎找不到nodemon。 注意:我的主机上没有安装节点或npm 以下是我的项目(测试)根文件夹中的文件。(这只是一份草稿) Dockerfile FROM surenderthakran/nodejs:v4 ADD . /test WORKDIR /test RUN make install CMD make run SHELL:=/bin/bash PWD:=$(sh

我试图将我的工作节点代码从主机装载到docker容器中,并使用docker compose使用nodemon运行它。 但容器似乎找不到nodemon。 注意:我的主机上没有安装节点或npm

以下是我的项目(测试)根文件夹中的文件。(这只是一份草稿)

Dockerfile

FROM surenderthakran/nodejs:v4
ADD . /test
WORKDIR /test
RUN make install
CMD make run
SHELL:=/bin/bash
PWD:=$(shell pwd)
export PATH:= $(PWD)/node_modules/.bin:$(PWD)/bin:$(PATH)
DOCKER:=$(shell grep docker /proc/1/cgroup)

install:
    @echo Running make install......
    @npm config set unsafe-perm true
    @npm install

run:
    @echo Running make run......
# Check if we are inside docker container
ifdef DOCKER
    @echo We are dockerized!! :D
    @nodemon index.js
else
    @nodemon index.js
endif

.PHONY: install run
Makefile

FROM surenderthakran/nodejs:v4
ADD . /test
WORKDIR /test
RUN make install
CMD make run
SHELL:=/bin/bash
PWD:=$(shell pwd)
export PATH:= $(PWD)/node_modules/.bin:$(PWD)/bin:$(PATH)
DOCKER:=$(shell grep docker /proc/1/cgroup)

install:
    @echo Running make install......
    @npm config set unsafe-perm true
    @npm install

run:
    @echo Running make run......
# Check if we are inside docker container
ifdef DOCKER
    @echo We are dockerized!! :D
    @nodemon index.js
else
    @nodemon index.js
endif

.PHONY: install run
docker compose.yml

app:
    build: .
    command: make run
    volumes:
        - .:/test
    environment:
        NODE_ENV: dev
    ports:
        - "17883:17883"
        - "17884:17884"
package.json

{
  "name": "test",
  "version": "1.0.0",
  "description": "test",
  "main": "index.js",
  "dependencies": {
    "express": "^4.13.3",
    "nodemon": "^1.8.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "api",
    "nodejs",
    "express"
  ],
  "author": "test",
  "license": "ISC"
}
index.js

'use strict';

var express = require('express');
我使用
docker compose build
构建图像。它成功地完成了。 但当我尝试使用docker compose up运行它时,我得到:

Creating test_app_1...
Attaching to test_app_1
app_1 | Running make run......
app_1 | We are dockerized!! :D
app_1 | /bin/bash: nodemon: command not found
app_1 | make: *** [run] Error 127
test_app_1 exited with code 2
Gracefully stopping... (press Ctrl+C again to force)
谁能给点建议吗


注意:我的基本图像的Dockerfile
surenderthakran/nodejs:v4
可以在这里找到:

问题已经解决。问题归结为我在装入的卷中没有
node\u模块

基本上,在执行
docker compose build
时,映像已正确生成,实际代码已添加到映像中,并通过项目根目录中的
npm install
创建
node\u modules
文件夹。但是使用
docker compose up
时,代码被装载到项目根目录中,并且覆盖了先前添加的代码,包括新创建的
node\u modules
文件夹

因此,作为一种解决方案,我妥协在主机上安装nodejs,并在主机上执行
npm安装。因此,当我的代码被装载时,我仍然在我的项目根目录中获得了我的
node\u modules
文件夹,因为它也是从我的主机装载的

不是一个非常优雅的解决方案,但由于它是一个开发设置,我准备妥协。在生产中,我将使用
docker build
docker run
进行设置,并且无论如何都不会使用
nodemon

如果有人能给我一个更好的解决方案,我将不胜感激


谢谢

我认为您应该在包.json中使用预安装脚本

因此,在脚本部分,只需添加脚本:

 "scritpts": {
     "preinstall": "npm i nodemon -g",
     "start": "nodemon app.js",
 }

你该走了:)

回答得太晚了。但是您可以使用名为命名卷的东西在docker volumes空间中装载节点_模块。这样它会隐藏绑定挂载。

如果您以交互方式尝试,它是否有效?@allprog是的,它以交互方式工作声音就像路径问题一样-尝试使用指向nodemon的完整路径:
/PATH/to/nodemon
@ChrisMcKinnel问题已经解决。请随意提出一个更好的解决方案,因为我的解决方案不是很优雅。Thanks@allprog这个问题已经解决了。请随意提出一个更好的解决方案,因为我的解决方案不是很优雅。谢谢,我对npm/node不太熟悉,但我认为您可以使用
npm install-g
将它们安装到项目根目录之外的其他url,然后使用
npm link
链接到它们,而不是在本地再次安装它们?另一种选择可能是使用
npm config set prefix
将它们安装到容器中的自定义路径,然后在项目目录中有一个符号链接,指向该目录下的
/node\u modules
。我认为这将适用于add和volumes.Bullseye解决方案。在
运行npm安装之前,可能需要
运行npm set unsafe perm true