我正在尝试访问应用程序目录中文件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/
内,还有更多具有类似神秘名称的文件夹。
答案 0 :(得分:5)
请注意,Docker容器的文件系统不打算由用户从主机访问。实际上它非常复杂,因为Docker在你的情况下使用分层的写时复制文件系统(比如AUFS,但是这是特定于发行版的;除了Ubuntu之外的大多数发行版都使用Devicemapper而不是AUFS ,IIRC)。你看到的是文件系统层,每个都包含与一个父层的差异。
如果要在应用程序容器中记录内容,则应考虑以下其中一种可能性:
将您的日志文件放入卷。您可以将主机目录作为卷安装并在其中写入文件。您需要在创建容器时使用-v
标记(-v <host-directory>:<dir in container>
)指定挂载:
docker run -v /var/log/myapplication:/path/to/app/in/container myimage
将您的日志写入 stdout ,让Docker担心日志。您可以使用
访问日志(是的,它只是一个大文件)docker logs <container-name>
您还可以在/var/lib/docker
中的Docker运行时目录(通常为/var/lib/docker/containers/<container-id>/<container-id>-json.log
)中找到日志文件。此日志文件不会自动轮换,因此可能会变大。
使用外部日志记录服务将日志数据写入网络中的其他位置。典型的候选人将是syslog(旧学校)或设置类似Logstash或Graylog的内容。
答案 1 :(得分:3)
@helmberts的答案非常棒并且可以满足您的所有需求,我尝试给菜肴添加一点盐(以及dokku-不是特定于码头工具的东西)。
关键是,您的应用程序处于可恢复的开关环境中。通过部署(java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/mina/filter/executor/OrderedThreadPoolExecutor;
at org.apache.ftpserver.listener.nio.NioListener.<init>(NioListener.java:76)
at org.apache.ftpserver.listener.ListenerFactory.createListener(ListenerFactory.java:90)
at org.apache.ftpserver.impl.DefaultFtpServerContext.<init>(DefaultFtpServerContext.java:91)
at org.apache.ftpserver.FtpServerFactory.<init>(FtpServerFactory.java:51)
at com.ken.androidftpserver.MainActivity.onCreate(MainActivity.java:19)
at android.app.Activity.performCreate(Activity.java:5958)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.mina.filter.executor.OrderedThreadPoolExecutor" on path: DexPathList[[zip file "/data/app/com.ken.androidftpserver-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at org.apache.ftpserver.listener.nio.NioListener.<init>(NioListener.java:76)
at org.apache.ftpserver.listener.ListenerFactory.createListener(ListenerFactory.java:90)
at org.apache.ftpserver.impl.DefaultFtpServerContext.<init>(DefaultFtpServerContext.java:91)
at org.apache.ftpserver.FtpServerFactory.<init>(FtpServerFactory.java:51)
at com.ken.androidftpserver.MainActivity.onCreate(MainActivity.java:19)
at android.app.Activity.performCreate(Activity.java:5958)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
Suppressed: java.lang.ClassNotFoundException: org.apache.mina.filter.executor.OrderedThreadPoolExecutor
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 19 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
),您可以设置好祖先,每次启动应用程序后,都会创建一个在停止容器后死亡的克隆(种类)。
您可以git push
查看它的外观。
您可以进行更改(dokku run myapp ls /
),但这些更改不会保留(dokku run myapp touch /mytouched.file
为您提供新的克隆!)和#34;丢失&#34;立即。如果您想永久保存文件,请使用卷并将其安装到app-container(s)中。对此有一个很酷的plugin (dokku-volume)。
我无法告诉你如何删除旧的差异。