Node.js docker:在创建新用户后运行npm安装时遇到问题

Node.js docker:在创建新用户后运行npm安装时遇到问题,node.js,ubuntu,npm,docker,coreos,Node.js,Ubuntu,Npm,Docker,Coreos,因此,我有另一个后续问题,关于在CoreOS上的Docker下安装基于node.js的框架 因此,由于npm对通过root从package.json安装非常挑剔,我必须创建一个非root sudo用户才能安装包。这就是我的Dockerfile当前在我们的repo中的样子,它是基于ubuntu映像构建的: # Install dependencies and nodejs RUN apt-get update RUN apt-get install -y python-software-prope

因此,我有另一个后续问题,关于在CoreOS上的Docker下安装基于node.js的框架

因此,由于
npm
对通过root从
package.json
安装非常挑剔,我必须创建一个非root sudo用户才能安装包。这就是我的
Dockerfile
当前在我们的repo中的样子,它是基于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>

 ...
错误:尝试解锁javascript-brunch@1.7.1,它还没有被锁定
解锁时(/usr/lib/node_modules/npm/lib/cache.js:1304:11)
在cb(/usr/lib/node_modules/npm/lib/cache.js:646:5)
在/usr/lib/node_modules/npm/lib/cache.js:655:20
在/usr/lib/node_modules/npm/lib/cache.js:1282:20
在afterMkdir(/usr/lib/node_modules/npm/lib/cache.js:1013:14)
at/usr/lib/node_modules/npm/node_modules/mkdirp/index.js:37:53
在Object.oncomplete(fs.js:107:15)
如果您需要帮助,可以报告此*整个*日志,
包括npm和节点版本,位于:
...

关于我应该如何修改Dockerfile有什么想法吗?我只能假设这是一个许可问题,与我在上面配置
非root
用户的方式有关,这可能是Docker框架特有的;我在一个普通的ubuntu安装上做这类事情没有问题,尽管不是通过脚本。

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

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

sudo chown [username] .npm
现在我可以使用Yeoman和npm了,没有错误:)


希望有帮助

所以结果可能是这样的


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

我有一些修改/建议:

  • 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
    之前。文章中提供了更多详细信息/示例

  • 您不必担心在
    Dockerfile
    中以root身份运行东西,这是默认设置。您的问题可能与root无关,而是与主机目录中的内容有关。您是否需要从代码目录中清除锁定文件


为什么不进入容器并
sudo su-nonroot
运行完全相同的命令,这样您就可以更好地了解什么是错误的这似乎是重复的,除非我遗漏了一个本质区别:-)另外,
/src
目录是我唯一需要权限的目录。为什么我们需要将package.json复制到临时文件夹,而不是直接复制到/src?Dockerfile生成检查每个步骤是否有任何更改-如果没有任何更改,它可以重用缓存的生成步骤。如果您先单独执行
package.json
,如果您的代码已经更改,但package.json没有更改,则不必重新安装
node_模块
。这非常有帮助—与此同时—这里有一篇关于此方法的好文章:与其转到/src,不如尽早
复制package*.json./
,然后
运行npm安装
,然后用
复制复制所有其他内容这样,如果没有更改包,则不需要重新安装所有npm包。