簡體   English   中英

使用 sbt-native-packager 的 docker 支持添加/復制文件

[英]ADD/COPY files with sbt-native-packager's docker support

我正在使用 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"

所以在挖掘了一下之后,我似乎需要在target/docker/stagetest.txt 然后它起作用了。 但是我如何自動到達那里? 該文件實際上位於項目的根文件夾中。

我設法通過將文件添加到mappings in Universal來使其工作。 所以對你來說,你需要這樣的東西:

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

順便說一下,如果您這樣做,您將不需要COPY命令。

現在,我不確定這是否會將此映射添加到其他 sbt-native-packager 插件。 我希望評論者可以告訴我這是否屬實,但我的直覺是它會這樣做,這對你來說可能是一個交易破壞者。 但任何解決方法總比沒有好,對吧? 如果您使用Build.scala您可以使用 VM 參數來告訴sbt是否添加此映射...

您可以將所有其他文件(必須包含在容器映像中)放入文件夾src/universal 該文件夾的內容將自動復制到容器映像中的/opt/app文件夾中。 您不需要任何額外的配置。 有關其他信息,請參閱“通用包裝入門”

位於/src/universal的文件將在 Docker 容器中 Scala 應用程序的運行時目錄中可用。 這意味着如果你的應用有/src/universal/example.txt ,那么它可以通過scala.io.Source.fromFile("./example.txt")

對於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")
    ...
  }
}

我能夠使用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
})

您可以首先使用dockerPackageMappings將整個目錄添加到 Docker 映像的文件系統,然后將其作為附加 Docker 命令復制。

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

dockerCommands ++= Seq(
  Cmd("COPY", "frontend /opt/frontend"),
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM