如何为同步的源代码构建一个Docker容器?
问题描述:
我想为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文件夹内容。一种解决方案是将所有的应用程序内容复制到容器本身,然后运行容器,但这个解决方案对于开发项目来说是不切实际的,因为应用程序中的每个更新都需要构建另一个容器。所以,我的问题是:我如何构建这个容器,以便主机源代码中的每个更新都能反映正在运行的容器?
答
我找到了一个解决方案,基于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
这个命令告诉泊坞窗初始化容器,并仅在应用程序的子文件夹,而不是应用程序的整个根部结构,这种方式使所有装入卷在构建过程中进行的一系列配置。
文档说明:挂载覆盖但不删除已存在的内容。一旦挂载被删除,内容可以再次访问。第二部分也很重要。您的预先存在的内容在安装过程中无法访问。我不知道它是否可能(不知道应用程序),但解决方案可能是更改您的文件夹/应用程序结构。 E.G一个文件夹项目,其中包含你的package.json和bower.json ADD)+项目文件夹内的一个应用程序文件夹,用于安装应用程序。但不知道你的情况是否可能。 – lvthillo
它已经是这样了。文件package.json和bower.json位于应用程序的根文件夹中,并且根中的应用程序文件夹也包含所有其他应用程序文件。 – Digao
这对我来说不是很清楚。因此,package.json和bower.json位于/ app中,而您的应用程序实际上位于/ app/app/*中,或者您的意思是?当你的应用程序也在/ app中时,它会覆盖你的package.json和bower.json – lvthillo