我一直在 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 up 和 docker-compose run via bash),但也许不是?为了方便起见,我决定解决这个问题,并删除了我对 jsonminify 的使用。后来,我需要将 eval 模块添加到我的项目中,现在我得到了与该模块相同的错误。我觉得 docker-compose up 命令使用的图像副本比 docker-compose run 命令更旧,没有我最近的更改。
添加模块后,我按照文章中的流程进行操作 - 使用 docker-compose run 获取 bash shell 并运行 npm install --save module 在正在运行的实例中。我的 package.json 和 npm-shrinkwrap.json 文件正在更新,我在这两个文件中都看到了 eval 模块。
我对在 Docker 容器中进行开发还很陌生,所以我已经达到了“让我们试试这个”的地步;到目前为止我已经尝试过:
docker-compose build 后跟 docker-compose updocker-compose up --builddocker-compose build --no-cache 后跟 docker-compose updocker 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/
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10
我花了几天时间尝试安装ruby1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g
我正在尝试以一种更类似于普通RubyGem结构的方式构建我的Sinatra应用程序。我有以下文件树:.├──app.rb├──config.ru├──Gemfile├──Gemfile.lock├──helpers│ ├──dbconfig.rb│ ├──functions.rb│ └──init.rb├──hidden│ └──Rakefile├──lib│ ├──admin.rb│ ├──api.rb│ ├──indexer.rb│ ├──init.rb│ └──magnet.rb├──models│ ├──init.rb│ ├──invite.rb│ ├─
如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最
我正在尝试在SUSEEnterprise11SP3上安装compass。我得到以下信息。有什么想法吗?geminstallcompassBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingcompass:ERROR:Failedtobuildgemnativeextension./usr/bin/rubyextconf.rbmkmf.rbcan'tfindheaderfilesforrubyat/usr/lib64/ruby/ruby.hextconffailed,exitcode1Gemfileswi
我的heroku应用崩溃了,因为它找不到模块“SecureRandom”。我在gemfile中指定了我的Ruby版本,我的计算机、gemfile和Heroku似乎都匹配Ruby版本号,尽管不是补丁号。其他帖子建议将usr/bin/heroku指向特定的Ruby文件,但我不确定该怎么做(我的应用程序中没有Herokubin)。这看起来像是Ruby版本错误。我该如何解决这个问题?classOrderItemHeroku日志:/app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/dependenci
我目前正在做一个需要在ubuntu11.04上使用rackup命令的项目,但我收到一个错误:-bash:rackup:commandnotfound。我已经安装了rails和rackrubygems。任何帮助都会很棒! 最佳答案 如果你正在使用bundler那么也许你需要使用bundleexecbundleexecrackup 关于ruby-rackup:找不到命令,我们在StackOverflow上找到一个类似的问题: https://stackover