在Windows主机上通过Docker执行npm安装

时间:2016-01-22 09:18:07

标签: node.js docker npm boot2docker

我正在尝试通过docker工具箱为Windows主机上的devlopement环境创建一个docker dev工具容器,但是我在运行npm install命令时遇到了一些麻烦。 它在linux主机上工作正常,但在Windows主机上我遇到以下错误:

FROM node:latest

RUN apt-get update
RUN apt-get install vim -y
RUN useradd -ms /bin/bash node
RUN echo "fs.inotify.max_user_watches=100000" > /etc/sysctl.conf

ADD . /var/www/site
RUN chown -R node:node /var/www/site
RUN chown -R node:node /usr/local/lib/node_modules
RUN chown -R node:node /usr/local/bin

USER node
ENV HOME /var/www/site

WORKDIR /var/www/site

RUN npm install -g bower
RUN npm install --global gulp -y

EXPOSE 80 8080 35729

这是我的Dockerfile:

docker build -t dev_tools .

在Docker快速入门终端中,我使用以下命令:

构建图像(工作正常)

docker run --name=dev_tools_container -t --rm -v "//c/Users/Public/site:/var/www/site" --net=host dev_tools

构建容器(工作正常)

docker exec -it dev_tools_container npm install

尝试安装npm依赖项(发现错误):

{ error_message: 'You have exceeded your rate-limit for this API.',
results: [],
status: 'OVER_QUERY_LIMIT' }

感谢您的时间!

2 个答案:

答案 0 :(得分:4)

而不是

RUN npm install --global gulp -y

使用

RUN sudo npm install --global gulp -y

您尝试从用户gulp(非超级用户)安装node作为全局包。

或在将用户切换到节点之前安装gulp

USER node
RUN npm install --global gulp -y

编辑:

boot2docker 基于 VirtualBox 。出于安全原因,Virtualbox不允许在共享文件夹上使用符号链接。

启用符号链接您必须将 VBoxInternal2 / SharedFoldersEnableSymlinksCreate / SHARE_NAME 设置为 1 。 (以下是如何在Vargrant上进行描述的链接:Symbolic links and synced folders in Vagrant

VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

替换VM_NAME和SHARE_NAME并重新启动VirtualBox。

另一种解决方案是将--no-bin-link添加到npm

RUN npm install -g bower --no-bin-link
RUN npm install --global gulp -y --no-bin-link

编辑2

默认情况下,Windows 7安全策略不允许创建符号链接,因为它是潜在的安全威胁。如果用户不在管理员组中,请运行 secpol.msc 并导航至本地政策 - 用户权限分配,并将您的用户添加到创建符号链接

如果您的用户属于管理员组,请使用以管理员身份运行启动VirtualBox

答案 1 :(得分:2)

您可以将node_modules挂载为卷,因此它将是Docker容器中的Linux文件系统。将其添加到Dockerfile:

VOLUME /var/www/site/node_modules

您将在C:Users/Public/site/node_modules看到该目录,因为它对于安装点是必要的,但除非您在容器内,否则您将看不到任何内容。