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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Мне удалось получить эту работу с помощью 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
})

Ответ 4

Мне удалось добавить файлы таким образом:

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