【问题标题】:dokku - where is my application's directorydokku - 我的应用程序目录在哪里
【发布时间】:2015-05-05 17:54:41
【问题描述】:

我正在尝试访问我的 Node.js 应用程序的日志,该日志写入应用程序目录内的文件 mylogfile.log 中。 使用find / -type f -name mylogfile.log 我可以看到这个输出:

/var/lib/docker/aufs/diff/0303e86afdc58e13b5afcc07ea3694e0e9e6d5e5cf8530a0854a76fbe2baf574/app/mylogfile.log
/var/lib/docker/aufs/diff/a9a0dab44456acd8b43915ed686c282b778ab99df31f62076082e121274ef6e2/app/mylogfile.log
/var/lib/docker/aufs/mnt/0303e86afdc58e13b5afcc07ea3694e0e9e6d5e5cf8530a0854a76fbe2baf574/app/mylogfile.log   

这些目录是什么?

...mnt/...diff/ 内部还有更多具有相似神秘名称的文件夹。

【问题讨论】:

    标签: directory find docker dokku


    【解决方案1】:

    请注意,Docker 容器的文件系统不打算供用户从主机访问。实际上这很复杂,因为 Docker 使用分层的写时复制文件系统(在您的情况下就像 AUFS,但这是特定于发行版的;除了 Ubuntu 之外的大多数发行版都使用 Devicemapper 而不是 AUFS、IIRC)。您会看到文件系统层,每一层都包含与一个父层的差异。

    如果您想在应用程序容器中记录内容,您应该考虑以下可能性之一:

    1. 将您的日志文件放入一个。您可以将主机目录挂载为卷并在其中写入文件。您需要在创建容器时指定挂载,使用-v 标志(-v <host-directory>:<dir in container>):

      docker run -v /var/log/myapplication:/path/to/app/in/container myimage
      
    2. 将您的日志写入 stdout 并让 Docker 处理这些日志。您可以使用

      访问日志(是的,它只是一个大文件)
      docker logs <container-name>
      

      您还可以在 Docker 运行时目录(通常为 /var/lib/docker)的 /var/lib/docker/containers/&lt;container-id&gt;/&lt;container-id&gt;-json.log 中找到日志文件。但是,此日志文件不会自动轮换,因此它可能会变大。

    3. 使用外部日志记录服务将日志数据写入网络中的另一个位置。典型的候选人是syslog(老派)或设置类似LogstashGraylog

    【讨论】:

    • 哇,比我想象的要多,我发现了这个日志,但现在我担心它的大小,我没有手动部署 docker 容器,我使用的是 dokker,所以可以我会旋转它们或限制它们的大小,是否有任何内置工具可以做到这一点?我在谷歌上搜索它,但没有明显的成功。而且我真的不想通过在那里设置logstash容器来加载我的VPS......
    • 如果我理解正确,您可以控制容器内的应用程序,对吗?只需将您的日志文件不要写入应用程序目录,而是写入创建为 volume 的单独目录中。这可以是一个挂载的主机目录(然后你可以在主机上登录);或者,您可以将卷安装在 另一个 容器中并在那里登录。您也可以将/dev/log 挂载到您的容器中并使用 syslog 登录到主机的 syslog(尚未尝试过,但应该可以)。
    • 是的,我控制着应用程序,但不控制部署本身(由dokku自动制作),也许我只是误解了你,我对unix不太熟悉。我还不完全了解什么是卷(只是一些谷歌搜索的问题),但我担心,虽然我没有手动创建容器,但我无法设置安装。我可以使用 docker 手动创建容器,但它超出了 dokku 的范围,并且可能(我想)可能与它发生冲突。并且一旦我将再次使用 dokku 推送应用程序 - 一切都会被覆盖
    • 无论如何我想没有更好的方法来回答我最初的问题。将尝试弄清楚这一点。感谢您的回复。
    【解决方案2】:

    @helmberts 的答案很棒,可以满足您的所有需求,我尝试在这道菜中加一点盐(还有一些 dokku- 不是特定于 docker 的)。

    关键是,您的应用程序存在于可恢复的开关环境中。通过您的部署 (git push),您可以设置祖先,每次启动应用后,您都会创建一个克隆,一旦您停止容器(某种),该克隆就会死亡。

    您可以通过dokku run myapp ls / 来查看它的外观。 您可以进行更改(dokku run myapp touch /mytouched.file),但这些不会持久(dokku run 为您提供新的克隆!)并立即“丢失”。如果您想将文件永久保存在某个地方,请使用 volume 并将其挂载到您的应用容器中。有一个很酷的plugin (dokku-volume)

    我不能告诉你如何删除旧的差异。

    【讨论】:

    • 感谢这一点“盐”,并指出这个很棒的插件 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多