Docker:容器内由npm创build的文件权限

我有一个Dockerfile来创build一个开发环境来开发一个sailsJS应用程序。 我只是将我的源代码安装到容器中。 我在我的主机上做了我的Git提交,但是我想在容器中执行所有的npm命令。

我有以下的Dockerfile,我在Ubuntu 14.10中运行Docker(1.4.1):

FROM ubuntu:14.04 ### Utils ### RUN apt-get update RUN apt-get -y install build-essential git wget tar vim supervisor ### MongoDB ### RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list RUN apt-get update RUN apt-get install -y mongodb-org RUN mkdir -p /data/db ### NodeJS ### WORKDIR /tmp RUN wget -O node http://nodejs.org/dist/v0.10.33/node-v0.10.33-linux-x64.tar.gz RUN tar xf node RUN mv node-v0.10.33-linux-x64 /usr/local/node RUN ln -s /usr/local/node/bin/* /usr/local/bin ### Supervisord ### RUN mkdir -p /var/log/supervisor COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf ### Project ### RUN npm install -g sails bower WORKDIR /opt/sails CMD ["/usr/bin/supervisord"] EXPOSE 27017 1337 

我用下面的命令运行我的容器:

 docker run -d -ti -p 1337:1337 -p 27017:27017 -v ~/dev/pinne:/opt/sails --name test-app loikg/sailsjs-mongo 

问题是,当我在容器内使用npm命令来创build文件(如sails genearet api我没有在主机上写入权限。 我该如何解决?

用户和组不能从主机 – >容器同步。

您的容器中的服务以root身份运行(UID:0 GID:0)。 在容器中由root创build的任何文件都需要在主机上进行root访问。

一种解决scheme是在容器内创build一个与主机上的UID / GID相匹配的UID / GID。 然后,容器内的所有进程都需要使用该UID / GID,以便文件具有正确的所有权/许可权。

记住,这是UserID不是用户名。 而GroupID不是组名。 名称不需要匹配,只有数字ID。

这是一种皮塔饼。 你将不得不改变你的dockerfile来添加用户,确保你创build文件的进程使用正确的uid运行。

其中一个解决方法是使用重叠的卷,例如

 ... -v ~/dev/pinne:/opt/sails:ro -v /opt/sails/node_modules ... 

将允许写入/opt/sails/node_modules 。 缺点是在容器终止时更改将会丢失(除非通过--volumes-from复制卷数据)。 另一个需要注意的是/opt/sails/node_modules应该存在这个技术的工作path( ~dev/pinne/node_modules – > /opt/sails/node_modules )。