7

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

/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/还有更多具有类似神秘名称的文件夹。

4

2 回答 2

5

请注意,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. 将您的日志写入标准输出并让 Docker 担心这些日志。您可以使用访问日志(是的,它只是一个大文件)

    docker logs <container-name>
    

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

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

于 2015-05-05T21:20:37.063 回答
4

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

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

你可以dokku run myapp ls /看看它的样子。您可以进行更改 ( dokku run myapp touch /mytouched.file),但这些不会持久化(dokku run给您一个新的克隆!)并立即“丢失”。如果您想将文件永久保存在某个地方,请使用并将其安装到您的应用程序容器中。有一个很酷的插件(dokku-volume)

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

于 2015-08-08T13:32:10.227 回答