如何管理docker图像依赖(维护)

时间:2013-07-30 09:34:43

标签: docker

使用docker,您可以非常好地基于其他图像创建图像。例如,你可以制作一个图像Java-jdk7(基于最新的Ubuntu LTS),并在此基础上创建图像elastic-search和tomcat7(两者都需要java)。

所以,如果我没有标记我的图像,我最终得到以下内容(docker images的摘录):

╔══════════════════════╦════════╦══════════════╗
║      REPOSITORY      ║  TAG   ║      ID      ║
╠══════════════════════╬════════╬══════════════╣
║ ubuntu               ║ 12.04  ║ 8dbd9e392a96 ║
║ quintenk/jdk7-oracle ║ latest ║ 8928245086f4 ║
║ quintenk/tomcat7     ║ latest ║ 995cdb2cbfa8 ║
║ quintenk/elastics    ║ latest ║ 123abc456ef2 ║
╚══════════════════════╩════════╩══════════════╝

现在提出问题。我应该如何/应该保持这种依赖?如何执行维护1个图像和相关图像?

  1. 如果我更新我的jdk图像(例如apt-get upgrade),我认为我不会破坏相关图像?但是,我还假设依赖树不再像您期望的那样。 [更新:我已经复制了这个,所以请看下面我自己的答案]
  2. 如果1是正确的,是否有某种方法可以让依赖图像标记为过时,并且(希望)让它们自己重建?
  3. 或者是使用版本号标记容器的方法,并使用增加的版本号标记手动重建和重新分发所有依赖项?这意味着需要更改Dockerfiles才能进行更新。

    更新: 我在presentation的docker网站上找到了以下图片。但是,我不太确定如何执行此操作的步骤(特别是对我所描述的其他图像的依赖性)。

    Update flow for docker containers

3 个答案:

答案 0 :(得分:9)

这是一个很好的用例。请在Docker issues page上提交增强请求。

现在一种简单的方法是维护Dockerfiles并从那里进行更新,在您想要进行有意识的更改时重建图像。

答案 1 :(得分:7)

回答

  

如果我更新我的jdk图像(例如apt-get upgrade),我假设我没有破坏依赖图像?但是,我还假设依赖树不再像您期望的那样。

我通过更新依赖图像并检查依赖项来验证这一点。你得到的确是一个有效的状态,但依赖的图像不是基于你天真期望的图像:

docker dependency tree

答案 2 :(得分:0)

我觉得使用multi-stage builds也有助于避免这些陷阱。它将帮助您为每个应用程序保留单个dockerfile。