我的文档文件有两个Docker镜像:docs:v1
和docs: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文档并在日志中回显。
接下来,我使用:image: "docs:v2"
更新yml文件。然后重启我的应用程序:
# 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
日志已更新,没关系,但我的文档仍在版本1中! 这可能是令人惊讶的,但这实际上是预期的行为。根据{{3}}:“更新图片时,不会包含对数据卷的更改。”
是的,但我希望能够看到我更新的文档,所以让我们尝试删除文档容器和卷:
# 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.那是因为app容器仍然指向旧的Version1卷。所以我们也尝试删除应用程序(这次只是应用程序而不是卷):
# 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!我的旧日志不见了。
所以再次提出这个问题:如何更新文档图片,查看我的应用程序中的更改,并且仍然可以在重新启动时保留日志?
答案 0 :(得分:0)
您需要将卷映射到实际的FS。现在,您正在使用volume命令在容器中创建卷,这些卷绕过UFS并保留,即使容器已被删除,这也是您必须删除卷以使其正常运行的原因。将卷映射到主机O / S上的外部文件夹,然后在升级应用程序时,日志将存在,但应用程序已升级。
要清楚发生了什么:
您创建了初始应用&gt;体积inits&gt;日志已保存 升级应用&gt;日志未更新(更新图像时不会包含对数据卷的更改。)(预期行为) <删除数据量>升级应用&gt;新日志是旧日志消失,因为它们被删除。
要解析将卷装入主机O / S,以便它们保持不变,但可以在升级时写入。