使docker或Dockerfile感知git branch

时间:2016-08-11 09:05:03

标签: github dockerfile

是否存在使Dockerfile对git分支敏感的最佳实践?

背景:

我注意到docker hub自动构建,也检测到是否有多个git分支,并在更新时为每个分支进行自动构建,如下所示

enter image description here

这是一个非常好的功能,但它让我有一个问题。我的Dockerfile包含从git存储库签出的特定调用

FROM ubuntu:14.04
ENV DEBIAN_FRONTEND noninteractive
RUN git clone https://bitbucket.org/user/myrepo.git
WORKDIR /myrepo
RUN make

这意味着即使我在存储库中有了segl分支,所有docker-hub标记也只会提取master分支。

所以问题是:是否存在使Dockerfile对git hub分支敏感的最佳实践?

Uggly解决方案:

我可以改变docker构建文件,以便为该标记提取正确的分支,如

FROM ubuntu:14.04
ENV DEBIAN_FRONTEND noninteractive
RUN git -b my_branch clone https://bitbucket.org/user/myrepo.git
WORKDIR /myrepo
RUN make

但这会有两个主要缺点

  1. 我需要手动将-b my_branch添加到我希望此工作的每个新分支中的Dockerfile
  2. 当分支合并回master时,-b my_branch也会合并,然后中断Dockerfile分支中的master
  3. 这个问题讨论了添加几个docker-hub构建,但实际上并不是我需要的东西。 Docker Hub Automated Build - Tagging

    感谢建议

1 个答案:

答案 0 :(得分:1)

你可能不应该在Dockerfile中做一个git pull。

遵循基础架构作为代码实践,将Dockerfile包含在与代码相同的存储库中是有意义的,因此需要在另一个存储库中进行更改的更改将在同一个提交中捆绑在一起。如果是这种情况,只要您构建Docker镜像,您的应用程序的源代码就可用,您可以从磁盘复制它而不是从GitHub中提取它。

不幸的是,Docker的COPY指令不允许导航目录树,即使是符号链接或其他技巧,因此您需要手动创建repo的副本每次构建Docker镜像之前,都在repo 中。这可能看起来像这样:

[~/projects/my-app $]> rm -r docker/repo
[~/projects/my-app $]> cd ..
[~/projects $]> cp -r my-app repo
[~/projects $]> mv repo my-app/docker/
[~/projects $]> cd my-app
[~/projects $]> docker build docker

然后,您的Dockerfile将包含COPY repo/ /myrepo指令,将其复制到容器中。

我建议您使用已复制到其中的git sha标记图像。

在进行开发时,为了避免不得不一直重建,您只需使用docker run -v选项将本地仓库安装在烘焙到的版本之上图像。