18

我正在使用 sbt-native-packager 1.0.0-M5 创建我的 docker 映像。我需要添加一个不是源文件或资源文件夹中的文件。我的 docker 命令如下:

dockerCommands := Seq(
  Cmd("FROM", "myrepo/myImage:1.0.0"),
  Cmd("COPY", "test.txt keys/"), // <-- The failing part
  Cmd("WORKDIR", "/opt/docker"),
  Cmd("RUN", "[\"chown\", \"-R\", \"daemon\", \".\"]"),
  Cmd("USER", "daemon"),
  ExecCmd("CMD", "echo", "Hello, World from Docker")
)

它失败了:msg="test.txt: no such file or directory"

所以在挖掘了一下之后,我似乎需要test.txttarget/docker/stage. 然后它工作。但是我如何自动获得它呢?该文件实际上位于项目的根文件夹中。

4

5 回答 5

22

我设法通过将文件添加到mappings in Universal. 所以对你来说,你需要这样的东西:

mappings in Universal += file("test.txt") -> "keys/test.txt"

COPY顺便说一句,如果您这样做,您将不需要该命令。

现在,我不确定这是否会将此映射添加到其他 sbt-native-packager 插件。我希望评论者能告诉我这是否属实,但我的直觉是它会这样做,这对你来说可能会破坏交易。但是任何解决方法都比没有好,对吧?如果您使用Build.scala,您可以使用 VM 参数来判断sbt是否添加此映射...

于 2015-03-13T21:18:11.103 回答
11

您可以将所有附加文件(必须包含在容器映像中)放入文件夹src/universal中。该文件夹的内容将自动复制到/opt/app容器映像中的文件夹中。您不需要任何额外的配置。有关更多信息,请参阅“通用包装入门”

位于 Docker 容器中的 Scala 应用程序的运行时目录中的文件/src/universal将可用。这意味着如果你的应用有/src/universal/example.txt,那么它可以通过scala.io.Source.fromFile("./example.txt")

于 2017-05-16T11:53:02.757 回答
3

对于sbt-docker插件,而不是 sbt-native-packager

我能够以这种方式添加文件:

例如,添加一个位于src/main/resources/docker/some-file.ext

dockerfile in docker := {
  val targetPath = "/usr/app"

  // map of (relativeName -> File) of all files in resources/docker dir, for convenience
  val dockerFiles = {
    val resources = (unmanagedResources in Runtime).value
    val dockerFilesDir = resources.find(_.getPath.endsWith("/docker")).get
    resources.filter(_.getPath.contains("/docker/")).map(r => dockerFilesDir.toURI.relativize(r.toURI).getPath -> r).toMap
  }

  new Dockerfile {
    from(s"$namespace/$baseImageName:$baseImageTag")
    ...
    add(dockerFiles("some-file.ext"), s"$targetPath/some-file.ext")
    ...
  }
}
于 2015-11-04T16:17:05.350 回答
3

我能够使用dockerPackageMappings

dockerPackageMappings in Docker += (baseDirectory.value / "docker" / "ssh_config") -> "ssh_config"

dockerCommands := (dockerCommands.value match {
  case Seq(from@Cmd("FROM", _), rest@_*) =>
    Seq(
     from,
     Cmd("Add", "ssh_config", "/sbin/.ssh/config")
  ) ++ rest
})
于 2017-01-27T02:31:18.490 回答
0

您可以将整个目录添加到 Docker 映像的文件系统,方法是首先使用 使其可用dockerPackageMappings,然后将其复制为附加的 Docker 命令。

import NativePackagerHelper._
dockerPackageMappings in Docker ++= directory(baseDirectory.value / ".." / "frontend" )

dockerCommands ++= Seq(
  Cmd("COPY", "frontend /opt/frontend"),
)
于 2020-08-01T10:02:15.800 回答