docker:在创建新用户后运行npm install时遇到问题

时间:2014-02-21 05:57:54

标签: node.js ubuntu npm docker coreos

所以我有另一个关于在CoreOS上根据this post在Docker下安装基于node.js的框架的后续问题。

所以,因为npm对于从package.json通过root进行安装非常挑剔,所以我必须创建一个非root sudo用户才能安装该软件包。这就是我的Dockerfile目前在我们的回购中看起来像是基于ubuntu图像:

# Install dependencies and nodejs
RUN apt-get update
RUN apt-get install -y python-software-properties python g++ make
RUN add-apt-repository ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get install -y nodejs

# Install git
RUN apt-get install -y git

# Bundle app source
ADD . /src

# Create a nonroot user, and switch to it
RUN /usr/sbin/useradd --create-home --home-dir /usr/local/nonroot --shell /bin/bash nonroot
RUN /usr/sbin/adduser nonroot sudo
RUN chown -R nonroot /usr/local/
RUN chown -R nonroot /usr/lib/
RUN chown -R nonroot /usr/bin/
RUN chown -R nonroot /src

USER nonroot

# Install app source
RUN cd /src; npm install

我知道这是一种不太优雅的做事方式,但我不知道如何在这里完成npm安装。当我尝试上述操作时,我尝试安装时会在所有软件包上出现错误:

 Error: Attempt to unlock javascript-brunch@1.7.1, which hasn't been locked
     at unlock (/usr/lib/node_modules/npm/lib/cache.js:1304:11)
     at cb (/usr/lib/node_modules/npm/lib/cache.js:646:5)
     at /usr/lib/node_modules/npm/lib/cache.js:655:20
     at /usr/lib/node_modules/npm/lib/cache.js:1282:20
     at afterMkdir (/usr/lib/node_modules/npm/lib/cache.js:1013:14)
     at /usr/lib/node_modules/npm/node_modules/mkdirp/index.js:37:53
     at Object.oncomplete (fs.js:107:15)
 If you need help, you may report this *entire* log,
 including the npm and node versions, at:
     <http://github.com/npm/npm/issues>

 ...

有关如何修改Dockerfile的任何想法?我只能假设这是一个许可问题,与我在上面配置nonroot用户的方式有关,这可能是Docker框架特有的;我只是在一个普通的ubuntu安装上做这种事情没问题,尽管不是来自脚本。

3 个答案:

答案 0 :(得分:10)

所以事实证明这可能是an issue with docker

能够通过从USER nonroot切换到RUN /bin/su nonroot来解决这个问题,之后一切正常。

答案 1 :(得分:8)

在尝试创建任何自耕农项目时,我遇到了类似的错误,最终找到了解决方案:)

我收到了这个错误,因为我的主目录中的.npm文件夹的所有者是“root”用户所以我用了

sudo chown [username] .npm

现在我可以毫无错误地使用Yeoman和npm:)

希望它有所帮助!

答案 2 :(得分:5)

我有一些修改/建议的建议:

  • 使用类似的内容在Dockerfile之前缓存您的节点模块(在apt-get之后:

    ADD package.json /tmp/package.json
    RUN cd /tmp && npm install
    RUN mkdir -p /src && cp -a /tmp/node_modules /src
    

    这样,如果您的应用程序代码发生变化,您每次都不会重建所有节点模块。把它放在ADD . /src之前。有关详细信息/示例,请参阅my blog post文章。

  • 您不应该担心在Dockerfile中以root用户身份运行...这是默认设置。也许您的问题与root相关,但与主机目录中的内容无关。你可能需要从代码的dir中清除一个锁文件吗?