File Docker:容器内npm创建的文件的权限
我有一个Dockerfile来创建一个开发环境来开发一个sailsJS应用程序。 我只是将源代码装入容器中。我在主机上提交Git,但我希望在容器中执行所有npm命令 我有以下Dockerfile,我正在ubuntu 14.10中运行Docker(1.4.1):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
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
)应该存在,以使此技术能够工作。如果不知道主机上的哪个用户将在前端运行容器,您如何做到这一点?