【问题标题】:docker: having trouble running npm install after creating a new userdocker:创建新用户后运行 npm install 时遇到问题
【发布时间】:2014-03-15 01:21:20
【问题描述】:

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

所以,因为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 安装上做这种事情没有问题,尽管不是从脚本。

【问题讨论】:

  • 你为什么不进入你的容器和sudo su - nonroot 并运行完全相同的命令,这样你就可以更好地了解问题所在
  • 这似乎与this other question 重复,除非我错过了本质区别:-)

标签: node.js ubuntu npm docker coreos


【解决方案1】:

原来这可能是an issue with docker

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

【讨论】:

  • /src 目录也是我唯一需要权限的目录
【解决方案2】:

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

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

sudo chown [username] .npm

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

希望对你有帮助!

【讨论】:

    【解决方案3】:

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

    • 使用类似这样的方式在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 身份运行东西...这是默认设置。也许您的问题与根目录无关,而是与主机目录中的内容有关。您是否可能需要从代码目录中清除锁定文件?

    【讨论】:

    • 为什么我们需要将 package.json 复制到一个临时文件夹而不是直接复制到 /src?
    • Dockerfile 构建检查每个步骤以查看是否有任何更改 - 如果没有任何更改,它可以重用缓存的构建步骤。如果您首先将 package.json 作为单独的步骤执行,如果您的代码已更改但您的 package.json 未更改,则无需重新安装您的 node_modules
    • 非常有帮助 - 配合这个 - 这是一篇关于这种方法的好文章:bitjudo.com/blog/2014/03/13/…
    • 而不是移动到/src,只是早COPY package*.json ./,然后RUN npm install,然后用COPY . .复制其他所有内容,这样,如果没有包改变,你不需要重新安装所有npm 包。
    猜你喜欢
    • 2020-02-08
    • 2019-11-24
    • 2021-10-16
    • 1970-01-01
    • 2017-09-10
    • 2021-08-02
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多