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

时间:2014-12-30 20:33:13

标签: file permissions npm docker sails.js

我有一个Dockerfile来创建开发环境来开发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命令创建像sails genearet api这样的文件时,我在主机上没有写入权限。 我该如何解决?

2 个答案:

答案 0 :(得分:1)

用户和群组不会从host->容器同步。

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

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

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

这是一种皮塔饼。您将不得不更改dockerfile以添加用户,确保创建文件的进程使用正确的uid等运行。

答案 1 :(得分:1)

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

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

允许写入/opt/sails/node_modules。缺点是容器终止时更改将丢失(除非您通过--volumes-from复制卷数据)。 AFAIR的另一个警告是该路径(~dev/pinne/node_modules - > /opt/sails/node_modules)应存在,以使此技术有效。