一、简介
.Git 是领先的软件开发版本控制系统。另一方面,Dockerfile 包含自动构建应用程序映像的所有命令。这两种产品是任何寻求采用DevOps 的人的完美组合。
在本教程中,我们将学习结合这两种技术的一些解决方案。我们将详细介绍每个解决方案并介绍其优缺点。
2. Git 存储库中的Dockerfile
始终可以访问Dockerfile 中的Git 存储库的最简单解决方案是将Dockerfile 直接保存在Git 存储库中:
ProjectFolder/ .git/ src/ pom.xml Dockerfile ...
上面的设置我们将允许我们访问整个项目源目录。命令将其包含在我们的容器中,例如:ADD
ADD . /project/
我们当然可以限制复制到构建目录的范围:
ADD /build/ /project/
或者像.jar 文件这样的构建输出:
ADD /output/project.jar /project/
这个解决方案的最大优点是我们可以测试任何代码更改而无需将它们提交到存储库。一切都将位于同一个本地目录中。
这里要记住的一件事是创建一个 它类似于 这有助于我们避免向Docker 构建过程发送不必要的大型或敏感文件和目录,并可能将它们添加到图像中。.dockerignore
file
.gitignore
3. 克隆Git 存储库
另一个简单的解决方案是在镜像构建过程中获取我们的git 存储库。我们可以通过简单地将SSH 密钥添加到本地存储并调用git clone
ADD ssh-private-key /root/.ssh/id_rsa RUN git clone git@github.com::eugenp/tutorials.git
上面的命令将获取整个存储库并将其放置在我们容器./tutorials
不幸的是,这个解决方案也有一些缺点。
首先,我们将我们的私有SSH 密钥存储在Docker 镜像中,这可能会带来潜在的安全问题。我们可以通过使用git 存储库的用户名和密码来应用解决方法:
ARG username=$GIT_USERNAMEARG password=$GIT_PASSWORDRUN git clone https://username:git@github.com::eugenp/tutorials.git
并将它们作为环境变量从我们的机器传递。这样我们就可以将git 凭据保留在我们的图像之外。
其次,即使我们的存储库发生更改,此步骤也会在以后的构建中缓存。这是因为带有 虽然,我们可以通过a RUN
docker build
–no-cache
另一个小缺点是我们必须在容器中安装git 包。
4. 卷映射
我们可以使用的第三个解决方案是卷映射。它使我们能够将目录从我们的机器挂载到Docker 容器中。它是存储Docker 容器使用的数据的首选机制。
我们可以通过在Dockerfile 中添加以下行来实现:
VOLUME /build/ /project/
这将/project
/build
当我们的Git 存储库仅用于构建过程时,卷映射将是最佳选择。通过将存储库保留在容器之外,我们不会增加其大小并允许存储库内容超出给定容器的生命周期。
我们需要记住的一件事是卷映射为Docker 容器提供了对挂载目录的写访问权限。此功能的不当使用可能会导致git 存储库目录中发生一些不需要的更改。
5. Git 子模块
如果我们将Dockerfile 和源代码保存在单独的存储库中,或者我们的Docker 构建需要多个源存储库,我们可能会考虑使用
首先,我们必须创建一个新的Git 存储库并将我们的Dockerfile 放在那里。接下来,我们可以通过将它们添加到.gitmodules 文件来定义我们的子模块:
[submodule "project"] path = project url = https://github.com/eugenp/tutorials.git branch = master
现在,我们可以像使用标准目录一样使用子模块。例如,我们可以将其内容复制到我们的容器中:
ADD /build/ /project/
请记住,子模块不会自动更新。我们需要运行以下git 命令来获取最新的更改:
git submodule update --init --recursive
0 评论