使用 docker-compose 仅​​保留选定卷的数据

Persist data only for selected volumes with docker-compose

我的文档文件有两个 Docker 图片:docs:v1docs:v2。 它们只包含 /docs 中的一些文件,公开为 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"

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

=> 我希望它能够将文档更新到 docs:v2,看到它按预期打印 "Version2" 并保持日志完整。

第一个运行:

# 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"。然后重新启动我的应用程序:

# 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! 这可能令人惊讶,但这实际上是预期的行为。根据 the docker docs:“更新图像时不会包含对数据量的更改。

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

# 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

啊!我的旧日志不见了。

所以问题又来了:我怎样才能更新文档图像,查看我的应用程序中的更改,并且仍然能够在重新启动时保留日志?

您需要将您的卷映射到您的实际文件系统。现在您正在使用 volume 命令在容器中创建卷,这些卷绕过 UFS 并且即使容器被删除也仍然存在,这就是为什么您必须删除卷才能使其正常运行。将卷映射到主机上的外部文件夹 O/S,然后当您升级应用程序时,日志将在那里,但应用程序已升级。

要弄清楚发生了什么:

您创建了初始应用程序 > 卷初始化 > 日志已保存。
升级应用 > 日志未更新(更新图像时不会包括对数据量的更改。)(预期行为)。
删除数据量 > 升级应用程序 > 新日志在那里 旧日志没有了,因为它们被删除了。

解决将卷挂载到主机 O/S 以便它们持久存在但可以在升级时写入的问题。