8

因此,根据这篇文章,我还有另一个关于在 CoreOS 上的 Docker 下安装基于 node.js 的框架的后续问题。

所以,因为npm从 root 安装很挑剔package.json,我必须创建一个非 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 安装上做这种事情没有问题,尽管不是来自脚本。

4

3 回答 3

10

所以事实证明这可能是docker 的问题

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

于 2014-03-12T23:15:09.433 回答
8

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

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

sudo chown [username] .npm

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

希望能帮助到你!

于 2014-03-07T05:27:17.330 回答
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. 更多详细信息/示例可在我的博客文章中找到。

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

于 2014-03-14T16:48:45.513 回答