Dokku - 我的应用程序目录在哪里?

7

我想要访问我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/ 中,还有许多具有类似神秘名称的文件夹。

2个回答

5
请注意,Docker容器的文件系统不适用于用户从主机中访问。这实际上非常复杂,因为Docker使用了分层的写时复制文件系统(在您的情况下,像AUFS,但这是特定于发行版的;除Ubuntu之外的大多数发行版使用Devicemapper而不是AUFS,如果我没记错的话)。你看到的是文件系统层,每个层包含到一个父层的差异。
如果你想在应用程序容器内记录东西,你应该考虑以下几种可能性:
  1. Put your log files into a volume. You can mount a host directory as a volume and write files in there. You need to specify mounts when creating the container, using the -v flag (-v <host-directory>:<dir in container>):

    docker run -v /var/log/myapplication:/path/to/app/in/container myimage
    
  2. Write your logs to stdout and let Docker worry about the logs. You can access the log (yes, it'll be just one big file) using

    docker logs <container-name>
    

    You'll also find the log file in your Docker runtime directory (usually /var/lib/docker) in /var/lib/docker/containers/<container-id>/<container-id>-json.log. This log file won't be rotated automatically however, so it might grow big.

  3. Use an external logging service to write log data to another location in your network. Typical candidates would be syslog (old-school) or setting up something like Logstash or Graylog.


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

4
@helmberts的回答很好,已经给出了你需要的一切,我尝试为这道菜加入一点调味料(并且不是针对docker特定的内容)。
重点是,你的应用程序存在于一个可恢复的开关环境中。通过部署(git push),你在某种程度上设置了祖先,每次启动应用程序之后,你都会创建一个克隆版本,一旦停止容器,它就会消失(有点像)。
你可以使用 dokku run myapp ls / 来查看它的样子。 你可以进行更改(dokku run myapp touch /mytouched.file),但这些更改不会被持久化(dokku run 会给你一个全新的克隆版本!)并且会立即“丢失”。如果你想要把文件永久保存在某个地方,请使用并将其挂载到你的应用程序容器中。有一个很酷的插件(dokku-volume)可以实现这个功能。
我无法告诉你如何删除旧的差异。

谢谢您提供这个“盐”,并指出这个很棒的插件 =) - Max Yari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接