Git 如何自动推拉修改后的docker图像?

Git 如何自动推拉修改后的docker图像?,git,docker,Git,Docker,我有一个docker映像,可以在多个具有不同参数的服务器上运行。 在docker映像中,有一个git存储库需要以任何方式提取。 所以我需要一些东西: 以交互模式运行docker的主映像-it 将git存储库拉到docker中 提交git拉取导致的容器差异 将新映像推送到docker云注册表 在已安装docker的每个服务器中拉取新映像 一些问题: 这个程序正确吗?还是有其他方法 有没有办法执行步骤1、2,将一些参数传递给run命令,比如bash脚本或其他什么 当我执行docker pull时,我

我有一个docker映像,可以在多个具有不同参数的服务器上运行。 在docker映像中,有一个git存储库需要以任何方式提取。 所以我需要一些东西:

以交互模式运行docker的主映像-it 将git存储库拉到docker中 提交git拉取导致的容器差异 将新映像推送到docker云注册表 在已安装docker的每个服务器中拉取新映像 一些问题:

这个程序正确吗?还是有其他方法

有没有办法执行步骤1、2,将一些参数传递给run命令,比如bash脚本或其他什么

当我执行docker pull时,我是否需要关闭已经运行的docker容器,并在pull操作结束后重新启动它,或者docker非常聪明地理解它需要重新启动容器

我发现它可以远程处理容器的更新。我还没试过,但我会的

编辑: 我已经创建了2个脚本。docker映像中执行git拉取的第一个。docker映像外部的第二个将从用户或自动程序启动。第二个脚本执行以下操作:

将docker运行到分离模式,获取从run命令返回的容器id

使用docker exec命令执行第一个脚本

使用先前保存的容器id提交容器

将新映像推送到云注册表中

停止容器


现在,我需要尝试watchtower程序或找到其他工具。

要获得此功能的净效果,您应该:

编写一个Docker文件,将应用程序安装在一个原始的Docker容器中,运行Docker build将生成一个映像

将此Dockerfile与源代码一起签入git存储库

设置一些CI系统,以便在每次更改时重建Docker容器,并使用一些唯一的标记(时间戳、git提交哈希、相关git标记)对其进行标记,然后将其推送到存储库

在容器正在运行的系统上,docker停止并处理容器,然后docker使用新的标记图像运行容器

与您描述的方法相比,这种方法有两个重要的优点。首先,任何拥有源存储库的人都可以准确地重建正在运行的映像。在您的方法中,如果您不小心丢失了一个正在运行的容器,您将无法重现正在运行的内容。第二个问题是,如果构建出错,只需将标记更改回,就可以很容易地回滚到运行以前版本的映像

特别是,如果您问我是否可以使用docker运行bash脚本之类的东西,以便docker提交结果,docker文件几乎正是您想要的

最后一步是这些步骤中定义最不明确的一步。您可以使用一个简单的集群管理器工具,如Ansible,使容器在某些地方运行;或者在Docker Swarm上运行的Docker Compose YAML文件中更新图像版本;或者你发现的了望塔工具看起来可以做到这一点。这是Kubernetes做得非常好的事情,但这是一项投资


在您描述的工作流程中,我想说的有几件事显然不是生产环境中的最佳实践。我建议您基本上不应该使用docker提交docker构建非常简单,可以为您提供可复制的图像构建;即使是在这样一个问题的背景下,我的Dockerfile也比我在容器中做了一堆东西然后提交要容易得多。docker exec对于调试很有用,但不应该是与容器交互的主要方式。最后,使用相同的图像名称/标记并在同一标记下提交不同的图像会使回滚到旧版本的代码变得困难。不要使用:latest标记。

只是想一想,您是否查看过:?您可以制作一个脚本,当容器运行时,它将执行git pull并获得最新版本的repo,这样docker映像将始终保持不变,您只需要另一种机制来强制重新创建这些容器感谢@Hito的回复。实际上是的,我找到了entrypoint命令脚本,但我不希望每次启动docker时,它都会执行git pull。我想在我的服务器上集中管理每个docker映像,并且每个映像都是主映像的精确副本。另外,如果我有一个永不停止的docker,我就不能触发入口点。目前我找到了另一个解决方案,我将在编辑栏中写下。非常感谢您非常满意的回复!我在码头工人的世界里基本上是新手,所以我试着去理解它。我创建了一个Dockerfile,它需要大约10/15分钟来编译,这是常见的构建时间还是等待的时间太长了?这是
阻止我每次重建Dockerfile的主要原因。我必须说,我需要重建它的唯一原因是因为docker映像中的git存储库已被修改,所以我需要更新它并将新版本传播到其他服务器。这很不寻常。如果包含Dockerfile的存储库非常大,那么初始复制步骤可能会花费很多时间;通过.dockrignore文件排除文件会有所帮助。如果第一次安装步骤需要一段时间,docker build将记住第二次运行时第一次运行的结果,并基本上跳过这些步骤。在更普通的项目中,尤其是在没有编译步骤的情况下,构建一个映像通常需要花费我几秒钟的时间。在这种情况下,我需要安装一堆apt数据包和一些初步的web调用操作。我已经学习了很多如何制作Dockerfile和Dockerfile的最佳实践,并尝试应用所有这些对策来保持图像大小较低,但结果是图像大小为1.5GB。特别是,我有>30个apt数据包要安装,2个git repo要克隆,还有其他几个web调用要进行。