【问题标题】:Error when running node container using docker compose使用 docker compose 运行节点容器时出错
【发布时间】:2017-08-15 15:52:55
【问题描述】:

运行“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进行热重载

【问题讨论】:

  • 我认为解释了这个问题的另一种可能的解决方案here

标签: node.js docker npm docker-compose nodemon


【解决方案1】:

我最终得到了与我最初所做的类似的事情。不知道是什么导致了我的 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-compose 中的服务:

  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

这样我的依赖项只安装在构建上。

【讨论】:

    【解决方案2】:

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

    如果容器内有 10 个文件,主机上有 0 个文件,则在卷映射后,您的容器将看到 0 个文件。因为主机文件夹已安装并且它没有任何内容。所以你Dockerfile声明

    RUN npm install
    

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

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

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

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

    编辑(8 月 14 日):

    如果您希望您的依赖项出现在映像中,那么您需要对您的 docker-compose.yml 进行一些更改,您需要保留内部代码并将该目录中的 node_modules 链接到您的应用程序目录

    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 在您运行映像时可能是错误的。但是有了我上面建议的新编辑,这应该可以工作

    【讨论】:

    • 此解决方案有效,但会导致 npm install 在每个“docker-compose up”上运行,这是不可取的。构建映像时应安装依赖项。
    • 谢谢。从未想过创建符号链接。在调查时,我发现了一种似乎也有效的替代方法。看我的回答。
    • 不确定不同方法是否有优缺点?
    • 我认为这两种方法都很好,我没有意识到你的 compose 中的 NODE_PATH 环境变量,否则会建议你做同样的事情
    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 2021-05-13
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多