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

Я использую sbt-native-packager 1.0.0-M5 для создания своего образа докера. Мне нужно добавить файл, который не является исходным файлом или в папке ресурсов. Мои команды 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, Тогда это работает. Но как мне получить это там автоматически? Файл фактически находится в корневой папке проекта.

6 ответов

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

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

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

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

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

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

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

Я смог добавить файлы следующим образом:

Например, чтобы добавить файл, расположенный в 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")
    ...
  }
}

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

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

dockerCommands ++= Seq(
  Cmd("COPY", "frontend /opt/frontend"),
)

Если вы хотите рекурсивно скопировать всю папку/каталог, вы также можете использовать универсальный плагин (аналогично ответу @2rs2ts). У него есть вспомогательный метод, который копирует локальную папку в образ.

      import com.typesafe.sbt.packager.MappingsHelper.directory
Universal / mappings ++= directory("path/to/myFolder")

« Путь /к/папке» относится к корневому каталогу вашего проекта.

Каталог будет скопирован в /opt/docker/myFolder в целевом образе.

Другие вопросы по тегам