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 в целевом образе.