8

我在里面使用 WebSphere Liberty。由于 WebSphere Liberty 需要频繁的 xml 编辑,而这对于 Dockerfile 命令是不可能的。我必须不时对容器进行 docker-commit,以便其他人使用我的图像。

命令如下:

docker commit -m "updated sa1" -a "Song" $id company/wlp:v0.1

学院也在对镜像做类似的事情,他们每天继续多次 docker commit 容器。

有一天,我们将在生产环境中部署该映像。

Q1:是否建议频繁 docker-committing 的做法?

Q2:它会留下任何潜在的问题吗?

Q3:它会创建一个额外的层吗?我阅读了docker-commit 文档,它没有提到它是否创建了另一个层,我认为这意味着没有。

4

1 回答 1

8

我不会使用 docker commit,

这似乎是一个非常好的主意,但是您不能像使用 Dockerfile 那样随意复制图像,而且一旦完成,您也无法更改基本图像,因此很难提交例如安全性修补底层操作系统基础映像。

如果您采用完整的 Dockerfile 方法,您可以重新运行 docker build,您将再次获得相同的图像。并且您可以更改基本映像。

所以我的经验法则是,如果您正在创建一个临时工具并且您不关心随意重用或复制图像,那么提交使用起来很方便。

据我了解,Docker 每个容器映像都有两部分,这是一组构成映像主体的只读层,然后是一个可写入的小层,可在提交任何更改的地方写入。

当您运行 commit docker 继续创建一个新图像,这是基础图像加上您所做的更改(创建的图像是一个不同的图像),它将代码复制到薄可写层。因此,不会创建一个新的只读层,它只是将您制作的增量存储到薄可写层中。

不要只信我的话,听听 Redhats 的建议

为了清楚起见,第 5 步中的文章说:

5) 不要从正在运行的容器创建镜像——换句话说,不要使用“docker commit”来创建镜像。这种创建图像的方法是不可复制的,应该完全避免。始终使用完全可重现的 Dockerfile 或任何其他 S2I(源到映像)方法,如果将 Dockerfile 存储在源代码控制存储库 (git) 中,则可以跟踪对 Dockerfile 的更改。

于 2018-08-09T09:44:01.117 回答