只保留具有do​​cker-compose的选定卷的数据

我的文档文件有两个Docker镜像: docs:v1docs:v2 。 他们只包含/文件中的一些文件公开为VOLUME

 # docker run --rm docs:v1 cat /docs/doc.txt Version1 # docker run --rm docs:v2 cat /docs/doc.txt Version2 

我有我的应用程序描述在这个docker-compose.yml(使用v1.4):

 app: image: "busybox" command: /bin/sh -c "cat /docs/doc.txt && echo `date` >> /logs/log.txt" volumes: - "/logs" volumes_from: - "docs" docs: image: "docs:v1" 

所以基本上我的应用程序打印文档的内容,并在日志文件中回显当前date。 日志文件也在VOLUME

=>我想要的只是为了能够将文档更新为docs:v2 ,请参阅按预期打印“版本2”,并保持日志不变。

第一次运行:

 # docker-compose up Creating tmp_docs_1... Creating tmp_app_1... Attaching to tmp_docs_1, tmp_app_1 app_1 | Version1 ... # docker run --rm --volumes-from tmp_app_1 busybox cat /logs/log.txt Tue Aug 25 22:09:11 UTC 2015 

它按预期工作:打印Version1文档并在日志中回显。

接下来,我使用以下命令更新yml文件: image: "docs:v2" 。 然后重新启动我的app:

 # docker-compose up Recreating tmp_docs_1... Recreating tmp_app_1... Attaching to tmp_docs_1, tmp_app_1 app_1 | Version1 ... # docker run --rm --volumes-from tmp_app_1 busybox cat /logs/log.txt Tue Aug 25 22:09:11 UTC 2015 Tue Aug 25 22:10:26 UTC 2015 

日志已经更新,没关系,但是我的文档仍然在Version1中! 这可能是令人惊讶的,但这实际上是预期的行为。 根据docker文档 :“ 更新图像时不会更改数据量。

对,但是我希望能够看到我的更新文档,所以让我们尝试删除文档容器和卷:

 # docker-compose rm -v docs Removing tmp_docs_1... done # docker-compose up Creating tmp_docs_1... Starting tmp_app_1... Attaching to tmp_docs_1, tmp_app_1 app_1 | Version1 ... 

没有运气..仍在版本1中。这是因为应用程序容器仍然指向旧版本1卷。 所以让我们尝试删除应用程序(只是应用程序,而不是这次的卷):

 # docker-compose rm app Removing tmp_app_1... done # docker-compose up Starting tmp_docs_1... Creating tmp_app_1... Attaching to tmp_docs_1, tmp_app_1 app_1 | Version2 

版本2:它的工作! 我们来检查日志:

 # docker run --rm --volumes-from tmp_app_1 busybox cat /logs/log.txt Tue Aug 25 22:19:21 UTC 2015 

Ach! 我的旧日志不见了

所以这里再次提出这个问题:如何更新文档图像,查看我的应用程序的变化,仍然能够保持重新启动日志?

你会想把你的卷映射到你的实际的FS。 现在,您正在使用volume命令在容器中创build卷,这些卷即使在容器被删除的情况下也会绕过UFS,因此您必须删除卷以使其正常运行。 将卷映射到主机操作系统上的外部文件夹,然后在升级应用程序时,日志将在那里,但应用程序已升级。

要清楚发生了什么:

您创build初始app>卷inits>日志已保存。
升级应用程序>日志不会更新(更新映像时不会更改数据卷。)(预期行为)。
删除数据卷>升级应用程序>新日志在那里旧日志已经消失,因为它们被删除。

要解决将卷挂载到主机操作系统的问题,以便它们可以持续存在,但可以在升级时写入。