关于node.js:使用docker compose运行节点容器时出错

Error when running node container using docker compose

运行" docker-compose up"时,出现以下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
npm info lifecycle [email protected]~dev: [email protected]

> [email protected] 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.
(/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 [email protected]~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! [email protected] dev: `nodemon -L ./bin/www --exec babel-node`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] dev script 'nodemon -L ./bin/www --
exec babel-node'.

我的dockerfile看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
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"]

我的服务是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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:

1
2
3
4
5
6
7
8
9
10
11
12
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-compose中的服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  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

这样,我的依赖项仅安装在构建中。


您的问题是卷共享。从主机到容器共享卷时。如果文件夹已经存在于容器中,则宿主容器将隐藏容器文件夹。

如果容器中有10个文件,主机上有0个文件,则在进行卷映射后,容器将看到0个文件。因为主机文件夹已挂载,但没有任何内容。所以你Dockerfile声明

1
RUN npm install

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

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

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

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

编辑(8月14日):

如果您希望依赖项显示在映像中,那么您需要在docker-compose.yml中进行少量更改,您需要做的是保留内部代码,只需将node_modules从该目录链接到您的应用程序目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,这在运行映像时可能是错误的。但是通过上面我建议的新编辑,这应该可以工作