node.js - docker-compose up 找不到模块,但从 bash 运行有效

标签 node.js docker docker-compose

我一直在 Docker 上构建 Node.js 应用程序,并遵循 John Lees-Miller 出色的 Lessons from Building a Node App in Docker 中的建议用于设置我的环境。一两个星期以来一切正常,但今天我开始遇到一个我无法弄清楚的问题。

简而言之,我无法再通过 docker-compose up 运行应用程序;我收到新添加的模块依赖项的 Node 错误:

sfsftp_1  | module.js:327
sfsftp_1  |     throw err;
sfsftp_1  |     ^
sfsftp_1  | 
sfsftp_1  | Error: Cannot find module 'eval'
sfsftp_1  |     at Function.Module._resolveFilename (module.js:325:15)
sfsftp_1  |     at Function.Module._load (module.js:276:25)
sfsftp_1  |     at Module.require (module.js:353:17)
sfsftp_1  |     at require (internal/module.js:12:17)
sfsftp_1  |     at Object.<anonymous> (/home/app/sfsftp/lib/reformatter.js:4:13)
sfsftp_1  |     at Module._compile (module.js:409:26)
sfsftp_1  |     at Object.Module._extensions..js (module.js:416:10)
sfsftp_1  |     at Module.load (module.js:343:32)
sfsftp_1  |     at Function.Module._load (module.js:300:12)
sfsftp_1  |     at Module.require (module.js:353:17)

但是,如果我运行 bash shell:

docker-compose run --rm sfsftp /bin/bash 

并使用 node sftp.js 从容器内部启动 Node 应用程序,应用程序启动正常!

我今天早些时候最初遇到了这个问题,模块 jsonminify 是我最近添加到项目中的;我相信自从进行了更改后,我已经以两种方式运行了该应用程序(docker-compose updocker-compose run via bash),但也许不是?为了方便起见,我决定解决这个问题,并删除了我对 jsonminify 的使用。后来,我需要将 eval 模块添加到我的项目中,现在我得到了与该模块相同的错误。我觉得 docker-compose up 命令使用的图像副本比 docker-compose run 命令更旧,没有我最近的更改。

添加模块后,我按照文章中的流程进行操作 - 使用 docker-compose run 获取 bash shell 并运行 npm install --save module 在正在运行的实例中。我的 package.jsonnpm-shrinkwrap.json 文件正在更新,我在这两个文件中都看到了 eval 模块。

我对在 Docker 容器中进行开发还很陌生,所以我已经达到了“让我们试试这个”的地步;到目前为止我已经尝试过:

  • docker-compose build 后跟 docker-compose up
  • docker-compose up --build
  • docker-compose build --no-cache 后跟 docker-compose up
  • docker run -p 22:9001 sftpdocker_sfsftp

最后一个有效 - 直接运行 docker,而不是通过 docker-compose。但这失去了设置的一些好处。如何让 docker-compose 工作?

作为引用,这里是我的Dockerfile:

# prepared with reference to http://jdlm.info/articles/2016/03/06/lessons-building-node-app-docker.html
# Current LTS Node version
FROM node:4.6.0

# Let's not run as Root.  And, update to recent NPM
RUN useradd --user-group --create-home --shell /bin/false app &&\
  npm install --global npm@3.7.5

ENV HOME=/home/app

# Get what we need for npm install
COPY package.json npm-shrinkwrap.json $HOME/sfsftp/
RUN chown -R app:app $HOME/*

# and install dependencies
USER app
WORKDIR $HOME/sfsftp
RUN npm install && npm cache clean

# do this after dependencies, so that if only the app changes, npm install won't be rerun
USER root
COPY . $HOME/sfsftp
RUN chown -R app:app $HOME/*
USER app

# Start it up!
CMD ["node", "sftp.js"]

docker-compose.yml:

sfsftp:
  build: .
  ports:
    - '22:9001'
  volumes:
    - .:/home/app/sfsftp
    - /home/app/sfsftp/node_modules

最后,package.json:

{
  "name": "sftp2sf",
  "version": "1.0.0",
  "description": "",
  "main": "sftp.js",
  "scripts": {
    "start": "node sftp.js",
    "test": "mocha",
    "coverage": "istanbul cover _mocha -- -R spec && open coverage/lcov-report/index.html"
  },
  "author": "Jason Clark <jason.clark@example.com>",
  "license": "UNLICENSED",
  "dependencies": {
    "buffer-equal-constant-time": "^1.0.1",
    "byline": "^5.0.0",
    "eval": "^0.1.1",
    "fast-csv": "^2.3.0",
    "jsforce": "^1.7.0",
    "jsonminify": "^0.4.1",
    "minimatch": "^3.0.3",
    "minimist": "^1.2.0",
    "moment": "^2.15.1",
    "ssh2": "^0.5.2",
    "through": "^2.3.8"
  },
  "devDependencies": {
    "chai": "^3.5.0",
    "istanbul": "^0.4.5",
    "mocha": "^3.1.0",
    "sinon": "^1.17.6",
    "stream-to-array": "^2.3.0"
  }
}

更新:解决建议的解决方案,删除 docker-compose.yml 的卷部分:卷部分是此设置的重要部分,并允许我的本地主机共享文件在开发过程中使用正在运行的 docker 镜像,除了只存在于镜像中的 node_modules;有关完整说明,请参阅链接文章。自从开始这个项目以来,我已经将这个设置与这些卷语句一起使用,并且至少有十几个其他 Node 模块以相同的方式安装,并且它们不会导致异常 - 如果我删除 eval,代码有效。

2016 年 11 月 17 日更新:这似乎可以自行修复;在将齿轮切换到更高优先级的项目几天后,我不再遇到问题。我不相信错误会自行修复,但我无法弄清楚我可能做了什么来解决这个问题。今天,我不得不在项目中添加一个新的 Node 模块(docker-compose -f docker-compose.yml run --rm sfsftp/bin/bash, npm install --save module 来自运行的 shell,docker-compose build),现在问题又回来了,只是找不到新模块。

最佳答案

我遇到了同样的问题,发现解决方案是移除容器然后再次启动它,即

npm install some-package --save

docker-compose down

docker-compose up --build

17 Nov 20 - edited the above to make it more succinct

关于node.js - docker-compose up 找不到模块,但从 bash 运行有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40167298/

相关文章:

node.js - 在 Node.js 中,请求回调是一种不好的做法吗?

javascript - Javascript 与 Google Dart 的比较

node.js - 如何使用mongoose动态连接多个mongodb数据库?

macos - 如何在启动时启动 Docker for Mac 守护程序?

Docker-compose:如何启动一个输出被抑制的容器

docker - 在容器内运行时如何修复 Webpack 'You may need an appropriate loader to handle this file type'?

node.js - socket.io 流式传输二进制数据

asp.net - Docker 从一个容器复制到另一个容器

python - 具有 apscheduler 的 Docker 镜像根本无法运行

image - psql : could not translate host name "postgres" to address: Temporary failure in name resolution