Файлы 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")
...
}
}