您在 Docker 中的何处创建应用程序 运行 的应用程序日志?

Where do you create application logs of app running in Docker?

您在 Docker 中的何处创建应用程序 运行 的应用程序日志,以便我稍后可以将它们映射到主机系统?

我在 documentation 中不清楚我是否应该在没有 root 权限的情况下在某些目录中创建日志(然后是哪个?)或者我可以以某种方式 chown 我需要的目录。

我尝试使用 /var/log/case/opt/case/logs 但没有成功。这是我缩小的 SBT 脚本

object build extends Build {

  lazy val root = Project(
    id = "case-server",
    base = file("."),
    settings = Defaults.coreDefaultSettings ++ graphSettings ++ Revolver.settings ++ Seq(

      version := "1.15",
      scalaVersion := "2.11.7",
      libraryDependencies ++= {
        val akkaV = "2.4.1"
        val akkaStreamV = "2.0.1"
        val scalaTestV = "2.2.5"
        Seq(
          "com.typesafe.scala-logging" %% "scala-logging-slf4j" % "2.1.2",
          "ch.qos.logback" % "logback-classic" % "1.1.+",
          "org.scalatest" %% "scalatest" % scalaTestV % "test"
        )
      },

      dockerBaseImage := "develar/java",
      dockerCommands := dockerCommands.value.flatMap {
        case cmd@Cmd("FROM", _) => List(cmd, Cmd("RUN", "apk update && apk add bash"))
        case other => List(other)
      },
      dockerExposedVolumes := Seq("/opt/case/logs"),
      version in Docker := version.value
    )
  ).enablePlugins(AssemblyPlugin).enablePlugins(JavaAppPackaging).enablePlugins(DockerPlugin)
}

执行此操作的正确方法是什么?

根据我的观点,您应该考虑不创建任何 log-file,而是使用(无缓冲的)stdout 在容器化环境中进行日志记录。

请看这里为什么这是个好主意http://12factor.net/logs

然后您可以使用 'docker logs' 获取日志 like described here

您不希望将应用程序日志写入容器文件系统上的文件中。其他解决方案是:

  • 将日志文件写入 docker volume
  • 将日志条目写入 stdout(这样它们将被转发到 Docker 引擎并可通过 docker logs 命令使用)

此外,如果您的应用程序正在将其日志条目写入 stdout,您可以依靠 Docker logging drivers 将这些日志发送到 syslogjournaldgelffluentdawslogs、json 文件,或任何提供 docker 日志驱动程序的日志收集系统。

使应用程序写入 stdout 而不是写入文件的技巧是将其配置为写入特殊文件 /proc/self/fd/1。写入此特殊文件的任何内容都将发送到 stdout