Dockerfile/npm:创建一个sudo用户来运行npm install

4

创建一个Dockerfile来安装我们创建的一个Node框架(参见我之前的帖子这里):

# 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希望不要以root身份运行。有没有一种方法可以链接一系列sudo useradd命令来创建具有sudo特权的临时用户,然后切换到USER运行npm install?编辑:更新了上面的内容,现在在成功创建用户并到达npm install行后遇到了以下问题。
 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>

有没有任何理由不使用“npm -g install”进行全局安装包? - TeTeT
是的,这将安装package.json中的所有内容,而不是一个包。 - fox
您能否提供您正在使用的 package.json 文件,以帮助其他人重现相同的问题? - jpetazzo
我得到了相同的错误。你已经解决了这个“尝试解锁问题”的问题吗? - Simon
我使用 su -l noroot -c 'npm install' 来解决问题,而不是使用 USER 语句。 - Simon
3个回答

8
"尝试解锁"问题通常是由于未正确设置环境变量HOME引起的。npm需要将其设置为一个它可以编辑的目录(它在那里设置和管理.npm目录)。
您可以在docker run调用中使用例如docker run -e "HOME=/home/docker"指定环境变量。

3
为解决“尝试解锁”的问题,首先尝试清除npm缓存,可以通过以下命令进行清理:
npm cache clean

之后,运行

npm install

1
我曾遇到过一个类似的 npm 安装错误,当我尝试以非 root 用户在我的 Dockerfile 中执行时。Svante 对这个问题的解释非常准确,npm 在 $HOME 目录下进行了一些缓存。以下是一个能够正常运行 npm install 的简单 Dockerfile:
FROM dockerfile/nodejs

# Assumes you have a package.json in the current dir
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 chown -R nonroot /src

# Switch to our nonroot user
USER nonroot

# Set the HOME var, npm install gets angry if it can't write to the HOME dir, 
# which will be /root at this point
ENV HOME /usr/local/nonroot

# Install app source
WORKDIR /src
RUN npm install

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接