我正在使用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.txt
中的target/docker/stage
。然后它工作。但是我如何自动获得它呢?该文件实际上位于项目的根文件夹中。
答案 0 :(得分:14)
我设法通过将文件添加到mappings in Universal
来使其工作。所以对你来说,你需要这样的东西:
mappings in Universal += file("test.txt") -> "keys/test.txt"
顺便说一下,如果这样做,你将不需要COPY
命令。
现在,我不确定是否要将此映射添加到其他sbt-native-packager插件。我希望评论者可以告诉我这是否属实,但我的直觉是它会这样做,这对你来说可能是一个破坏者。但任何解决方法都比没有好,对吧?如果您使用Build.scala
,您可以使用VM参数告诉sbt
是否添加此映射...
答案 1 :(得分:4)
您可以将所有其他文件(必须包含在容器图像中)放入文件夹src/universal
。该文件夹的内容将自动复制到容器图像中的/opt/app
文件夹中。您不需要任何其他配置。有关其他信息,请参阅"Getting started with Universal Packaging"。
位于/src/universal
的文件将在Docker容器中的Scala应用程序的运行时目录中提供。这意味着,如果您的应用具有/src/universal/example.txt
,则可以使用scala.io.Source.fromFile("./example.txt")
答案 2 :(得分: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")
...
}
}
答案 3 :(得分:2)
我能够使用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
})
答案 4 :(得分:0)
您可以首先通过使用dockerPackageMappings
将其添加到Docker映像的文件系统中,然后再将其作为其他Docker命令复制来添加整个目录。
import NativePackagerHelper._
dockerPackageMappings in Docker ++= directory(baseDirectory.value / ".." / "frontend" )
dockerCommands ++= Seq(
Cmd("COPY", "frontend /opt/frontend"),
)