在docker中,与commit和dockerfile不同
当我制作docker图片时,
通过提交命令和构build命令与docker文件的图像有没有什么区别? 我说在图像尺寸和algorithm方面的差异。
是。 大小会有差异。
docker提交基本上是“运行”容器的当前状态的“快照”,并将其保存为图像。 这基本上意味着如果您的“正在运行”的容器正在生成日志文件,更新软件包或进行文件更改,它们将被保存到映像中。 每次运行docker commit
,都会创build一个新的映像。
另一方面, docker build通过引用脚本(Dockerfile)来创build映像。 通常, docker build
只会在检测到变化的时候创build一个新的镜像。
这两种方法的图像大小取决于你在这两种情况下做了什么, docker build
会给你一致的图像大小,因为它是基于在Dockerfile
指定的Dockerfile
。 而docker commit
图片大小取决于容器的当前状态。 如果你在一个容器运行后删除了一堆东西,你可能会得到较小的图像,反之亦然。
总之,他们是相似的,但服务于不同的目的。 然后docker build
最终产品本质上是一个提交。
把它放在一个不同的类比docker build
就像git clone
,而docker commit
就像git commit
。
最好的方法是尝试一下(或者比较github上的代码,但它已经过去了我的睡前时间)。 结果图像中存在细微差异。 主要是一些引用不是用来caching以前的版本。 在我的例子中,与容器相关的命令是不同的。 老实说,我不能说为什么docker commit
版本更小,但这两个图像是基于相同的父层和大小非常相似。 为了可维护性,Dockerfile将会更容易pipe理。
Dockerfile版本
$ cat df.apt-get-git FROM debian:latest RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ git \ vim \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* $ docker build -t test-git:dockerfile -f df.apt-get-git . Sending build context to Docker daemon 248.3 kB Step 1 : FROM debian:latest ---> 7b0a06c805e8 Step 2 : RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y git vim && apt-get clean && rm -rf /var/lib/apt/lists/* ---> Running in 44588d9cdef4 Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB] Ign http://deb.debian.org jessie InRelease .... Updating certificates in /etc/ssl/certs... 174 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d....done. Processing triggers for systemd (215-17+deb8u5) ... ---> 01cb5ddcddd1 Removing intermediate container 44588d9cdef4 Successfully built 01cb5ddcddd1 $ docker inspect test-git:dockerfile [ { "Id": "sha256:01cb5ddcddd101e498ff9e09e4cb4efad85f49a3b87c5792c807ebccedc83977", "RepoTags": [ "test-git:dockerfile" ], "RepoDigests": [], "Parent": "sha256:7b0a06c805e8f23807fb8856621c60851727e85c7bcb751012c813f122734c8d", "Comment": "", "Created": "2016-12-28T02:55:23.950610688Z", "Container": "44588d9cdef49728a012a5a19657ac2b97b6de191ece375607a22043ae993043", "ContainerConfig": { "Hostname": "397f80c505a4", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "apt-get update \u0026\u0026 DEBIAN_FRONTEND=noninteractive apt-get install -y git vim \u0026\u0026 apt-get clean \u0026\u0026 rm -rf /var/lib/apt/lists/*" ], "ArgsEscaped": true, "Image": "sha256:7b0a06c805e8f23807fb8856621c60851727e85c7bcb751012c813f122734c8d", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": [], "Labels": {} }, "DockerVersion": "1.12.3", "Author": "", "Config": { "Hostname": "397f80c505a4", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "ArgsEscaped": true, "Image": "sha256:7b0a06c805e8f23807fb8856621c60851727e85c7bcb751012c813f122734c8d", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": [], "Labels": {} }, "Architecture": "amd64", "Os": "linux", "Size": 245152070, "VirtualSize": 245152070, "GraphDriver": { "Name": "aufs", "Data": null }, "RootFS": { "Type": "layers", "Layers": [ "sha256:f96222d75c5563900bc4dd852179b720a0885de8f7a0619ba0ac76e92542bbc8", "sha256:e839e7442c5bbd0a3843822997bcd6830f88fc03417ad6dfd4cc9cb9c6ce0dfa" ] } } ]
提交版本
$ docker run --name test-git-commit debian:latest /bin/sh -c 'apt-get update \ > && DEBIAN_FRONTEND=noninteractive apt-get install -y \ > git \ > vim \ > && apt-get clean \ > && rm -rf /var/lib/apt/lists/*' Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB] ... Updating certificates in /etc/ssl/certs... 174 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d....done. Processing triggers for systemd (215-17+deb8u5) ... $ docker commit test-git-commit test-git:commit sha256:141c140e3bb0b8a865e58cfd1674f9dac70623c6537f362b15a0ec0a8edbfd0c $ docker inspect test-git:commit [ { "Id": "sha256:141c140e3bb0b8a865e58cfd1674f9dac70623c6537f362b15a0ec0a8edbfd0c", "RepoTags": [ "test-git:commit" ], "RepoDigests": [], "Parent": "sha256:7b0a06c805e8f23807fb8856621c60851727e85c7bcb751012c813f122734c8d", "Comment": "", "Created": "2016-12-28T02:57:50.962700517Z", "Container": "5160a31123f3594255a03c42ab72a41ec1fbe72a394923608c8e5654e5d3027b", "ContainerConfig": { "Hostname": "5160a31123f3", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "apt-get update \\\n \u0026\u0026 DEBIAN_FRONTEND=noninteractive apt-get install -y \\\n git \\\n vim \\\n \u0026\u0026 apt-get clean \\\n \u0026\u0026 rm -rf /var/lib/apt/lists/*" ], "Image": "debian:latest", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "1.12.3", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "apt-get update \\\n \u0026\u0026 DEBIAN_FRONTEND=noninteractive apt-get install -y \\\n git \\\n vim \\\n \u0026\u0026 apt-get clean \\\n \u0026\u0026 rm -rf /var/lib/apt/lists/*" ], "Image": "", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "Architecture": "amd64", "Os": "linux", "Size": 236898630, "VirtualSize": 236898630, "GraphDriver": { "Name": "aufs", "Data": null }, "RootFS": { "Type": "layers", "Layers": [ "sha256:f96222d75c5563900bc4dd852179b720a0885de8f7a0619ba0ac76e92542bbc8", "sha256:c1fd858a68b921981cd15793cbf673a7794d950bb5cc70769ba250df7b7439f9" ] } } ]