2016-08-11 132 views
0

我想为nodejs-bower-grunt构建一个容器,但保持我的源代码与git存储库同步(本例中为Bitbucket)。这个想法是为我的团队提供一个容器,以便每个开发人员不需要在他们的环境中安装这些包。与其安装nodejs,bower和grunt来运行应用程序的前端,他们只是使用容器来管理它们并专注于源代码。所以这是我DockerFile:如何为同步的源代码构建一个Docker容器?

FROM ubuntu:14.04 

RUN  apt-get update 
RUN  apt-get install -y nodejs npm git git-core 
RUN  ln -s /usr/bin/nodejs /usr/bin/node 

WORKDIR /app 

ADD package.json /app/ 
ADD bower.json .bowerrc* /app/ 

RUN  npm install -g bower 
RUN  npm install -g grunt-cli 
RUN  npm install 
RUN  bower install --allow-root 

CMD ["grunt", "serve"] 

EXPOSE 9000 
EXPOSE 35729  

所以我建立容器中,然后运行使用此代码:

docker run -ti -p 9000:9000 -p 35729:35729 -d -v /home/MY_USER/Projects/app:/app --name app --net=host my_repository/app 

期待音量参数将注入的源代码放到/应用程序文件夹中的容器没有替换之前在DockerFile中配置的所有东西。据official documentation,内容应该保留: “/src/webapp挂载覆盖,但不删除已有的内容”,但事实证明,当我检查正在运行的容器时,挂载的内容由DockerFile替换为由参数传递的-v文件夹内容。一种解决方案是将所有的应用程序内容复制到容器本身,然后运行容器,但这个解决方案对于开发项目来说是不切实际的,因为应用程序中的每个更新都需要构建另一个容器。所以,我的问题是:我如何构建这个容器,以便主机源代码中的每个更新都能反映正在运行的容器?

+2

文档说明:挂载覆盖但不删除已存在的内容。一旦挂载被删除,内容可以再次访问。第二部分也很重要。您的预先存在的内容在安装过程中无法访问。我不知道它是否可能(不知道应用程序),但解决方案可能是更改您的文件夹/应用程序结构。 E.G一个文件夹项目,其中包含你的package.json和bower.json ADD)+项目文件夹内的一个应用程序文件夹,用于安装应用程序。但不知道你的情况是否可能。 – lvthillo

+0

它已经是这样了。文件package.json和bower.json位于应用程序的根文件夹中,并且根中的应用程序文件夹也包含所有其他应用程序文件。 – Digao

+0

这对我来说不是很清楚。因此,package.json和bower.json位于/ app中,而您的应用程序实际上位于/ app/app/*中,或者您的意思是?当你的应用程序也在/ app中时,它会覆盖你的package.json和bower.json – lvthillo

回答

0

我认为你将不得不从主当前图像的存储库中单独将容器的更改拉出。或者,您可以使用rsync之类的软件来同步本地Docker容器之间的实时文件更改,然后将其推送到源代码。

+0

我还想看看其他开发人员如何以可行的方式处理这些问题... – Digao

+0

好的,我认为我误解了你的问题或者没有透彻理解它 – nagrom97

2

我找到了一个解决方案,基于this后。运行容器正确的方法应该是这样的:

docker run -ti -p 9000:9000 -p 35729:35729 -d -v /home/MY_USER/Projects/app/app:/app/app --name app --net=host my_repository/app 

这个命令告诉泊坞窗初始化容器,并仅在应用程序的子文件夹,而不是应用程序的整个根部结构,这种方式使所有装入卷在构建过程中进行的一系列配置。