2015-02-23 12 views
11

Używam sbt-native-packager 1.0.0-M5 do utworzenia obrazu dokowanego. Muszę dodać plik, który nie jest plikiem źródłowym lub w folderze zasobów. Moje polecenia dokowane są następujące:Pliki ADD/COPY z obsługą docker sbt-native-packager

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") 
) 

nie powiedzie się z: msg="test.txt: no such file or directory"

Więc po wykopaniu około trochę wydaje muszę mieć test.txt w target/docker/stage. Wtedy to działa. Ale jak mogę to zrobić automatycznie? Plik znajduje się w folderze głównym projektu.

+1

Też się nad tym zastanawiałem. Mogę powiedzieć, że dodanie go jako mapowania ('mapowania w Docker' lub' dockerPackageMappings w Docker') nie działa, pomimo tego [wydaje się, że powinno działać] (https://github.com/sbt/sbt-native- packager/blob/master/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala # L94). – 2rs2ts

Odpowiedz

10

Udało mi się go uruchomić, dodając plik do mappings in Universal. Więc dla ciebie, to trzeba coś takiego:

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

nie trzeba będzie dowodzić COPY jeśli to zrobisz, przy okazji.

Teraz nie jestem pewien, czy to będzie dodać to mapowanie do innych wtyczek sbt-native-packager. Mam nadzieję, że komentator może mi powiedzieć, czy to prawda, czy nie, ale mam intuicję, że to zrobi, co może być dla ciebie przełomem. Ale każde obejście jest lepsze niż żadne, prawda? Jeśli używasz Build.scala mógłbyś może użyć argumentu VM powiedzieć sbt czy aby dodać mapowanie ...

+0

Jestem w stanie umieścić pliki w katalogu roboczym Docker w ten sposób, ale niestety w katalogu głównym. tzn. mapowanie do "/test.txt" wydaje się mieć zignorowane poprzedzające ukośniki. – akauppi

+0

Możesz uruchomić inne polecenie, aby przenieść plik tam, gdzie chcesz: dockerCommands + = ExecCmd ("RUN", "mv", s "$ {(defaultLinuxInstallLocation w Docker) .value} /keys/test.txt", "/wherever/you/want/test.txt") – radek1st

0

udało mi się dodać pliki w ten sposób:

Na przykład, aby dodać plik znajdujący się w 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

Niestety, jest to rozwiązanie dla wtyczki sbt-docker, a nie dla sbt-native-packager. – mzywiol

+1

Cóż, pomógł mi, odkąd próbowałem znaleźć rozwiązanie dla sbt-docker i google przyniósł mi tutaj. :) –

1

udało mi się uzyskać tej pracy za pomocą 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

Możesz Plac e wszystkie dodatkowe pliki (które muszą znajdować się w obrazie kontenera) do folderu src/universal. Zawartość tego folderu zostanie automatycznie skopiowana w folderze /opt/app w obrazie kontenera. Nie potrzebujesz żadnej dodatkowej konfiguracji. Aby uzyskać dodatkowe informacje, patrz "Getting started with Universal Packaging".

Powiązane problemy