2015-02-23 30 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"