Почему sbt-native-packager ставит bin/start как каталог вместо скрипта?

58
5

Я использую sbt-native-packager и sbt-docker для создания изображений Docker, как описано в этом уроке. Изображение Docker не будет запущено (разрешено отклонение), и при проверке выясняется, что bin/start создается как пустой каталог.

dan@cobalt:~/projects/confabulous/deva$ ls -l target/universal/stage/bin/
total 24
-rwxrw-r-- 1 dan dan 11591 Aug 5 20:44 deva
-rw-rw-r-- 1 dan dan 6211 Aug 5 20:44 deva.bat
drwxrwxr-x 2 dan dan 4096 Dec 31 1969 start

По какой-то причине у него также есть нулевая временная метка. Почему он создается как каталог, а не сценарий оболочки?

Здесь мои plugins.sbt:

addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.4")

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.7.4")

addSbtPlugin("io.spray" % "sbt-revolver" % "0.7.1")

addSbtPlugin("se.marcuslonnberg" % "sbt-docker" % "0.5.0")

resolvers += Classpaths.sbtPluginReleases

И вот мой build.sbt:

import DockerKeys._
import sbtdocker.{Dockerfile, ImageName}
import com.typesafe.sbt.packager.Keys._

organization := "com.confabulous"

name := "deva"

version := "0.0.1"

scalaVersion := "2.10.3"

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8", "-language:postfixOps")

resolvers ++= Seq(
"sonatype releases" at "https://oss.sonatype.org/content/repositories/releases/",
"sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/",
"typesafe repo" at "http://repo.typesafe.com/typesafe/releases/"
)

libraryDependencies ++= Seq(
"ch.qos.logback" % "logback-classic" % "1.0.9",
"com.typesafe.akka" % "akka-slf4j_2.10" % "2.3.3",
"com.typesafe.akka" %% "akka-actor" % "2.3.3",
"com.typesafe.akka" %% "akka-remote" % "2.3.3",
"com.typesafe.akka" %% "akka-agent" % "2.3.3",
"com.typesafe.slick" %% "slick" % "2.0.1-RC1",
"org.mozilla" % "rhino" % "1.7R4",
"org.postgresql" % "postgresql" % "9.3-1101-jdbc3",
"org.msgpack" %% "msgpack-scala" % "0.6.8",
"com.livestream" %% "scredis" % "1.1.2",
"com.confabulous" %% "messages" % "0.0.1-SNAPSHOT",
"com.confabulous" %% "db" % "0.0.1-SNAPSHOT"
)

packageArchetype.java_server

sbtdocker.Plugin.dockerSettings

mappings in Universal += baseDirectory.value / "docker" / "start" -> "bin/start"

docker <<= docker.dependsOn(com.typesafe.sbt.packager.universal.Keys.stage.in(Compile))

// Define a Dockerfile
dockerfile in docker <<= (name, stagingDirectory in Universal) map {
case (appName, stageDir) =>
val workingDir = s"/opt/${appName}"
new Dockerfile {
// Use a base image that contain Java
from("relateiq/oracle-java7")
maintainer("Dan Ellis <dan@halftreelabs.com>")
expose(1600)
add(stageDir, workingDir)
run("chmod", "+x", s"/opt/${appName}/bin/${appName}")
run("chmod", "+x", s"/opt/${appName}/bin/start")
workDir(workingDir)
entryPointShell(s"bin/start", appName, "$@")
}
}

imageName in docker := {
ImageName(
namespace = Some("confabulous.com"),
repository = name.value
//,tag = Some("v" + version.value))
)
}

спросил(а) 2014-08-06T11:28:00+04:00 6 лет, 2 месяца назад
1
Решение
82

Связанная статья является частью 2 серии, где адрес контейнера передается в программу Java по сценарию. Сам сценарий упоминается в части 1.

mappings in Universal принимает последовательность (File, String) кортежей. Файл копируется в путь, указанный строкой в полученном изображении.

В этом случае, если в файле baseDirectory.value/"docker"/"start" нет файла, то ничего не доступно для копирования, и в результате получается поведение, которое вы описываете.

Вы должны создать соответствующий стартовый скрипт, как описано в части 1.

ответил(а) 2014-08-06T18:55:00+04:00 6 лет, 2 месяца назад
81

Другой вариант - использовать экспериментальную поддержку Docker в sbt-native-packager.

Если вы удалите Docker связанные строки из build.sbt, и добавить maintainer настройки, вы можете:

sbt docker:stage генерирует файл Docker и контекст в target/docker/stage

sbt docker:publishLocal создает локальное изображение

sbt docker:publish создает изображение и sbt docker:publish его удаленно

Если вы хотите изменить команды, переданные стартовому скрипту, вы можете внести следующие изменения:

bashScriptExtraDefines := Seq(
"CLUSTER_IP=$(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')",
"addResidual ${CLUSTER_IP}"
)

addResidual - это функция в стартовом скрипте, сгенерированном sbt-native-packager, который добавляет дополнительный параметр в аргументы командной строки для программы.

addJava - это функция, которая добавляет дополнительный параметр в двоичный файл Java, который запускает вашу программу.

Ваш build.sbt может выглядеть так:

import com.typesafe.sbt.packager.Keys._

organization := "com.confabulous"

name := "deva"

version := "0.0.1"

scalaVersion := "2.10.3"

scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8", "-language:postfixOps")

resolvers ++= Seq(
"sonatype releases" at "https://oss.sonatype.org/content/repositories/releases/",
"sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/",
"typesafe repo" at "http://repo.typesafe.com/typesafe/releases/"
)

libraryDependencies ++= Seq(
"ch.qos.logback" % "logback-classic" % "1.0.9",
"com.typesafe.akka" % "akka-slf4j_2.10" % "2.3.3",
"com.typesafe.akka" %% "akka-actor" % "2.3.3",
"com.typesafe.akka" %% "akka-remote" % "2.3.3",
"com.typesafe.akka" %% "akka-agent" % "2.3.3",
"com.typesafe.slick" %% "slick" % "2.0.1-RC1",
"org.mozilla" % "rhino" % "1.7R4",
"org.postgresql" % "postgresql" % "9.3-1101-jdbc3",
"org.msgpack" %% "msgpack-scala" % "0.6.8",
"com.livestream" %% "scredis" % "1.1.2",
"com.confabulous" %% "messages" % "0.0.1-SNAPSHOT",
"com.confabulous" %% "db" % "0.0.1-SNAPSHOT"
)

packageArchetype.java_server

maintainer := "Dan Ellis <dan@halftreelabs.com>"

Дополнительная информация должна быть доступна из документации sbt-native-packager. Комментарии также приветствуются.

ответил(а) 2014-08-06T19:21:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема