【问题标题】:How to build a docker container for a synchronized source code?如何为同步源代码构建 docker 容器?
【发布时间】: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


【解决方案1】:

我找到了一个解决方案,基于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

此命令告诉 docker 初始化容器并仅在 app 子文件夹而不是应用程序的整个根结构中安装卷,这样可以保留在构建过程中进行的所有配置。

【讨论】:

    【解决方案2】:

    我认为您必须从当前主映像的存储库中单独将更改拉到容器中。或者,您可以使用 rsync 之类的东西在本地 docker 容器之间同步实时文件更改,然后将其推送到源代码。

    【讨论】:

    • 我还是想看看其他开发者是如何以可行的方式处理这些问题的……
    • 好的,我想我看错了你的问题或者没有完全理解它
    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 2018-04-28
    • 2017-08-10
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多