2015-02-23 64 views
11

我使用sbt-native-packager 1.0.0-M5创建我的泊坞窗图像。我需要添加一个不是源文件或资源文件夹的文件。我的搬运工命令如下:使用sbt-native-packager的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。然后它工作。但是,我如何自动获得它?该文件实际上在项目的根文件夹中。

+1

我也一直在想这个。我可以告诉你,将它添加为映射(Docker中的映射或Docker中的dockerPackageMappings)不起作用,尽管它[看起来应该可以工作](https://github.com/sbt/sbt-native-打包器/斑点/主/ SRC /主/阶/ COM /类型安全/ SBT /打包器/搬运工/ DockerPlugin.scala#L94)。 – 2rs2ts 2015-03-13 18:00:27

回答

10

我设法通过将文件添加到mappings in Universal来实现它。所以对你来说,你需要这样的事:

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

如果你这样做你会不会需要COPY命令,顺便说一句。

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

+0

我能够以这种方式将文件放置在Docker工作目录中,但不幸的是在根目录中。即映射到“/test.txt”似乎忽略了前面的斜杠。 – akauppi 2015-11-25 15:30:29

+0

您可以运行其他命令将文件移动到您想要的位置: dockerCommands + = ExecCmd(“RUN”,“mv”,s“$ {(Docker中的defaultLinuxInstallLocation).value} /keys/test.txt”, “/wherever/you/want/test.txt”) – radek1st 2016-03-16 09:58:17

0

我可以添加文件是这样的:

例如,添加位于文件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") 
    ... 
    } 
} 
+1

不幸的是,这是sbt-docker插件的解决方案,不适用于sbt-native-packager。 – mzywiol 2016-04-18 13:09:16

+1

那么它帮助了我,因为我试图找到sbt-docker和谷歌的解决方案把我带到这里。 :) – 2018-02-07 16:24:54

1

我能够使用dockerPackageMappings得到这个工作:

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

dockerCommands := (dockerCommands.value match { 
    case Seq([email protected]("FROM", _), [email protected]_*) => 
    Seq(
    from, 
    Cmd("Add", "ssh_config", "/sbin/.ssh/config") 
) ++ rest 
}) 
2

您可以PLAC e将所有其他文件(必须包含在容器图像中)存储到文件夹src/universal中。该文件夹的内容将自动复制到容器图像中的/opt/app文件夹中。你不需要任何额外的配置。有关其他信息,请参见"Getting started with Universal Packaging"