我有一个docker映像,可以在具有不同参数的许多服务器中运行。 在docker映像中,有一个git存储库,需要以任何方式将其拉出。 所以我需要一些东西:
一些问题:
run
命令一些参数? docker pull <new image>
时,我是否需要关闭已经运行的docker容器并在pull操作结束后重新启动它,或者docker非常聪明地理解它需要重新启动容器?我发现watchtower可以远程处理容器的更新。我还没有尝试过,但是会的。
编辑: 我创建了2个脚本。在docker映像中执行git pull的第一个。从用户或自动程序启动的docker映像之外的第二个映像。第二个脚本可以:
将docker运行到分离模式,获取从run命令返回的容器ID
使用docker exec
命令执行第一个脚本
使用先前保存的容器ID提交容器
将新映像推送到云注册表中
停止容器
现在,我需要尝试watchtower
程序或寻找其他工具。
答案 0 :(得分:1)
要获得此效果,您应该:
编写一个Dockerfile
来完成将应用程序安装到原始Docker容器中的工作(运行docker build
会生成一个映像)
将此Dockerfile
和源代码一起检查到git存储库中
设置一些CI系统,以在每次更改时重建Docker容器,并使用一些唯一的标签(时间戳,git提交哈希,相关的git标签)对其进行标记,并将其推送到存储库中
在运行容器的系统上,先docker stop && docker rm
个容器,然后docker run
用新的标记图像
与您所描述的相比,此方法具有两个重要优点。首先是拥有源存储库的任何人都可以完全重建正在运行的映像。 (在您的方法中,如果您不小心丢失了正在运行的容器,则无法重现正在运行的容器。)第二个是,如果构建出现错误,只需更改更改即可轻松回滚到运行先前版本的映像。标记回来。
尤其是,如果您问“我可以用docker run
运行bash脚本之类的东西,以便我可以docker commit
的结果”,则Dockerfile
几乎完全正确您正在寻找什么。
最后一步是定义最不明确的步骤。您可以使用简单的集群管理器工具(如Ansible)来使容器在特定位置运行;或更新在Docker Swarm上运行的Docker Compose YAML文件之类的映像版本;或您确定的watch望塔工具可以做到。这是Kubernetes的出色表现,但这是一项投资。
在您描述的工作流程中,有两件事我想说显然不是生产环境中的最佳实践。我建议您基本上不应该使用docker commit
(docker build
非常简单,并且可以为您提供可复制的映像构建;即使在出现SO问题的情况下,“这是我的Dockerfile”比“我在容器中做了很多东西,然后提交了”)。 docker exec
对于调试很有用,但不应该是与容器交互的主要方式。最后,使用相同的图像名称/标签并在同一标签下提交不同的图像,将很难回滚到旧版本的代码(“不要使用:latest
标签”)。