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

File Docker:容器内npm创建的文件的权限,file,permissions,npm,docker,sails.js,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

我有一个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
)时,我没有在主机中对它们的写入权限。
如何解决此问题?

用户和组不从主机->容器同步

容器中的服务正在以root用户身份运行(UID:0 GID:0)。在容器中由root创建的任何文件都需要在主机上具有root访问权限

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

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


有点像皮塔。您必须更改dockerfile以添加用户,确保创建文件的过程使用正确的uid运行等。

解决方法之一是使用重叠卷,例如

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

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

如果不知道主机上的哪个用户将在前端运行容器,您如何做到这一点?