【发布时间】:2016-08-11 13:19:47
【问题描述】:
我想为 nodejs-bower-grunt 构建一个容器,但要使我的源代码与 git 存储库(在本例中为 Bitbucket)保持同步。这个想法是为我的团队提供一个容器,这样每个开发人员都不需要在他们的环境中安装这些包。他们没有安装 nodejs、bower 和 grunt 来运行应用程序的前端,而是使用容器来管理它们并专注于源代码。所以这是我的 DockerFile:
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
期望 VOLUME 参数将源代码注入容器中的 /app 文件夹,而不替换之前在 DockerFile 中配置的所有内容。根据official documentation,内容应该被保留: “/src/webapp 挂载覆盖但不删除预先存在的内容”,但事实证明,当我检查正在运行的容器时,DockerFile 挂载的内容被 -v 替换通过参数传递的文件夹内容。一种解决方案是将所有应用程序内容复制到容器本身,然后运行容器,但这种解决方案对于开发项目来说是不切实际的,因为应用程序中的每次更新都需要构建另一个容器。所以,我的问题是:如何构建这个容器,使主机源代码中的每个更新都反映正在运行的容器?
【问题讨论】:
-
文档告诉我们:安装覆盖但不会删除预先存在的内容。移除挂载后,即可再次访问内容。第二部分也很重要。在挂载期间无法访问您预先存在的内容。我不知道它是否可能(不知道应用程序),但解决方案可能是更改您的文件夹/应用程序结构。例如,一个文件夹项目,其中包含您的 package.json 和 bower.json ADD) + 在项目文件夹中的一个文件夹,其中包含应用程序到您安装应用程序的位置。但不知道你的情况是否可行。
-
已经是这样了。文件 package.json 和 bower.json 位于应用程序的根文件夹中,根目录下的应用程序文件夹也包含所有其他应用程序文件。
-
对我来说不是很清楚。所以 package.json 和 bower.json 在 /app 中,你的应用程序实际上在 /app/app/* 或者你是什么意思?当您的应用程序也在 /app 中时,它将覆盖您的 package.json 和 bower.json
-
docker命令所在文件夹相同:/app.这是因为您需要运行这些命令来构建 bower 和 node 依赖项。但我假设 -v 参数(路径)正在覆盖由 Dockerfile 构建的结构,它应该在同一路径内构建依赖关系
-
确实如此。虽然没有真正覆盖,因为当您卸载卷时,您会在其中看到您的 package.json + bower.json。
标签: git docker gruntjs bower dockerfile