我有一个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
这样的文件时,我在主机上没有写入权限。
我该如何解决?
答案 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
)应存在,以使此技术有效。