ADD/COPY файлы с поддержкой докера sbt-native-packager

Я использую sbt-native-packager 1.0.0-M5 для создания образа докера. Мне нужно добавить файл, который не является исходным файлом или находится в папке ресурсов. Мои команды докера следующие:

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. Тогда это работает. Но как я могу получить его там автоматически? Файл фактически находится в корневой папке проекта.


person Andreas Du Rietz    schedule 23.02.2015    source источник
comment
Я тоже задавался этим вопросом. Я могу сказать вам, что добавление его в качестве сопоставления (mappings in Docker или dockerPackageMappings in Docker) не работает, несмотря на то, что кажется, должно работать.   -  person 2rs2ts    schedule 13.03.2015


Ответы (5)


Мне удалось заставить его работать, добавив файл в mappings in Universal. Итак, для вас вам понадобится что-то вроде этого:

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

Кстати, если вы сделаете это, вам не понадобится команда COPY.

Теперь я не уверен, добавит ли это сопоставление другие плагины sbt-native-packager. Я надеюсь, что комментатор может сказать мне, правда это или нет, но моя интуиция подсказывает, что так оно и будет, что может стать для вас нарушением условий сделки. Но любой обходной путь лучше, чем ничего, верно? Если вы используете Build.scala, вы могли бы использовать аргумент VM, чтобы сообщить sbt, добавлять ли это сопоставление или нет...

person 2rs2ts    schedule 13.03.2015
comment
Таким образом я могу размещать файлы в рабочем каталоге Docker, но, к сожалению, в корне. т. е. при сопоставлении с /test.txt предшествующая косая черта игнорируется. - person akauppi; 25.11.2015
comment
Вы можете запустить другую команду, чтобы переместить файл в нужное место: dockerCommands += ExecCmd(RUN, mv, s${(defaultLinuxInstallLocation в Docker).value}/keys/test.txt, /wherever/you/want/test. текст) - person radek1st; 16.03.2016
comment
Каков базовый каталог для этих сопоставлений? Например, относительно build.sbt в корне проекта, где собственный упаковщик будет искать test.txt? - person kag0; 05.04.2018
comment
@ kag0 прошло 3 года с тех пор, как я написал этот ответ (и 2,5 года с тех пор, как я в последний раз работал над проектом sbt), и у меня больше нет доступа к коду. Так что к сожалению не помню. - person 2rs2ts; 05.04.2018
comment
@ 2rs2ts Я понял это, немного поэкспериментировав. Базовым каталогом является корень проекта (так же, как и каталог build.sbt). Но обратите внимание, что если вы находитесь в подпроекте, базовый каталог по-прежнему остается тем же каталогом проекта ROOT build.sbt, а не подпроекта build.sbt. - person kag0; 05.04.2018

Вы можете поместить все дополнительные файлы (которые должны быть включены в образ контейнера) в папку src/universal. Содержимое этой папки будет автоматически скопировано в папку /opt/app в образе контейнера. Вам не нужна никакая дополнительная конфигурация. См. "Начало работы с Универсальная упаковка" для получения дополнительной информации.

Файлы, расположенные в /src/universal, будут доступны в каталоге среды выполнения для приложения Scala в контейнере Docker. Это означает, что если ваше приложение имеет /src/universal/example.txt, то к нему можно получить доступ с помощью scala.io.Source.fromFile("./example.txt")

person Nikolay Artamonov    schedule 16.05.2017

Я смог заставить это работать, используя 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
})
person jdprc06    schedule 27.01.2017

Для плагина 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")
    ...
  }
}
person AlonL    schedule 04.11.2015
comment
К сожалению, это решение для плагина sbt-docker, а не для sbt-native-packager. - person mzywiol; 18.04.2016
comment
Что ж, это помогло мне, так как я пытался найти решение для sbt-docker, и Google привел меня сюда. :) - person Kevin Pauli; 07.02.2018

Вы можете добавить целый каталог в файловую систему образа Docker, сначала сделав его доступным с помощью dockerPackageMappings, а затем скопировав его как дополнительную команду Docker.

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

dockerCommands ++= Seq(
  Cmd("COPY", "frontend /opt/frontend"),
)
person Ruurtjan Pul    schedule 01.08.2020