如何自动推送和拉出修改过的码头工人的图像?

时间:2018-08-30 15:10:01

标签: git docker

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

  1. 以交互模式(-it)运行docker的“主”映像
  2. 将git存储库拉到docker
  3. 提交容器的差异(由git pull引起)
  4. 将新映像推送到Docker云注册表中
  5. 在已安装docker的每台服务器中拉新映像

一些问题:

  • 此程序正确还是其他方法?
  • 是否可以执行步骤1,2,例如将bash脚本或其他内容传递给run命令一些参数?
  • 当我执行docker pull <new image>时,我是否需要关闭已经运行的docker容器并在pull操作结束后重新启动它,或者docker非常聪明地理解它需要重新启动容器?
  • 我发现watchtower可以远程处理容器的更新。我还没有尝试过,但是会的。

    编辑: 我创建了2个脚本。在docker映像中执行git pull的第一个。从用户或自动程序启动的docker映像之外的第二个映像。第二个脚本可以:

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

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

  • 使用先前保存的容器ID提交容器

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

  • 停止容器

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

1 个答案:

答案 0 :(得分:1)

要获得此效果,您应该:

  1. 编写一个Dockerfile来完成将应用程序安装到原始Docker容器中的工作(运行docker build会生成一个映像)

  2. 将此Dockerfile和源代码一起检查到git存储库中

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

  4. 在运行容器的系统上,先docker stop && docker rm个容器,然后docker run用新的标记图像

与您所描述的相比,此方法具有两个重要优点。首先是拥有源存储库的任何人都可以完全重建正在运行的映像。 (在您的方法中,如果您不小心丢失了正在运行的容器,则无法重现正在运行的容器。)第二个是,如果构建出现错误,只需更改更改即可轻松回滚到运行先前版本的映像。标记回来。

尤其是,如果您问“我可以用docker run运行bash脚本之类的东西,以便我可以docker commit的结果”,则Dockerfile几乎完全正确您正在寻找什么。

最后一步是定义最不明确的步骤。您可以使用简单的集群管理器工具(如Ansible)来使容器在特定位置运行;或更新在Docker Swarm上运行的Docker Compose YAML文件之类的映像版本;或您确定的watch望塔工具可以做到。这是Kubernetes的出色表现,但这是一项投资。

在您描述的工作流程中,有两件事我想说显然不是生产环境中的最佳实践。我建议您基本上不应该使用docker commitdocker build非常简单,并且可以为您提供可复制的映像构建;即使在出现SO问题的情况下,“这是我的Dockerfile”比“我在容器中做了很多东西,然后提交了”)。 docker exec对于调试很有用,但不应该是与容器交互的主要方式。最后,使用相同的图像名称/标签并在同一标签下提交不同的图像,将很难回滚到旧版本的代码(“不要使用:latest标签”)。