我在构建服务器上构建Docker镜像(使用TeamCity)。构建完成后,我想拍摄图像并将其部署到某个服务器(登台,制作)。
我找到的所有教程
我真的认为在(app)服务器上不应该做任何特别的事情。图像,IMO,应该作为封闭的,自给自足的二进制文件,代表整个应用程序,可以在构建服务器,测试,Q& A等之间传递。
但是,当我save
基于官方node
存储库的标准NodeJS应用程序时,它具有 1.2 GB 。将这样的文件从服务器传递到服务器并不是很舒服。
问:是否有某种方式可以导出/保存"上传"只是通过SSH更改了图像的部分(图层),而没有引入Docker存储库的复杂性?然后服务器将从公共hub.docker.com
中依次提取缺少的图层避免从我的网络缓慢上传到云端。
从技术角度来看,投资save
d tarfile的内容应该不难。 push
命令基本上就是这样 - 它永远不会上传回购中已经存在的图层。
Q2:您是否认为在我要部署到的docker-host上运行一个小型仓库以实现这一目标是一种很好的方法?
答案 0 :(得分:0)
如果你的代码可以存在于Github或BitBucket上,为什么不只是免费使用DockerHub Automated builds。在你的节点上你只需要docker pull user/image
。 github存储库和dockerhub自动构建都可以是私有的,因此您不必将代码暴露给全世界。虽然您可能需要为多个私有存储库或构建付费。
如果您仍然想要构建自己的图像,那么当您运行构建命令时,您会看到类似于以下内容:
Step 0 : FROM ubuntu
---> c4ff7513909d
Step 1 : MAINTAINER Maluuba Infrastructure Team <infrastructure@maluuba.com>
---> Using cache
---> 858ff007971a
Step 2 : EXPOSE 8080
---> Using cache
---> 493b76d124c0
Step 3 : RUN apt-get -qq update
---> Using cache
---> e66c5ff65137
每个哈希e.g. ---> c4ff7513909d
都是中间层。您可以在/var/lib/docker/graph
找到以该哈希命名的文件夹,例如:
ls /var/lib/docker/graph | grep c4ff7513909d
c4ff7513909dedf4ddf3a450aea68cd817c42e698ebccf54755973576525c416
只要将所有中间层复制到部署服务器,您就不需要外部docker存储库。如果您只更改其中一个中间层,则只需重新复制该中间层即可进行重新部署。如果您注意到DockerFile中列出的步骤都会导致中间层。只要您只更改DockerFile中的最后一行,您只需要上传一个图层。因此,我建议将您的ADD代码行放在docker文件的末尾。
ADD MyGeneratedCode /var/my_generated_code