This project tries to make a sbt plugin for the awesome jib project from google.
Add the following lines in project/plugins.sbt:
addSbtPlugin("de.gccc.sbt" % "sbt-jib" % "<sbt-jib-version>")
libraryDependencies += "com.google.cloud.tools" % "jib-core" % "<jib-core-version>"You can find the latest jib-core version in their release list.
sbt-jib |
jib-core |
|---|---|
| name | type | description |
|---|---|---|
| jibTarget | Option[File] | jib work directory |
| jibBaseImage | String | jib base image |
| jibBaseImageCredentialHelper | Option[String]] | jib base image credential helper cli name (e.g. ecr-login) |
| jibJvmFlags | List[String]] | jib default jvm flags |
| jibArgs | List[String]] | jib default args |
| jibEntrypoint | Option[List[String]] | jib entrypoint |
| jibImageFormat | JibImageFormat | jib default image format |
| jibTargetImageCredentialHelper | Option[String] | jib target image credential helper cli name |
| jibRegistry | String | jib target image registry (defaults to docker hub) |
| jibOrganization | String | jib docker organization (defaults to organization) |
| jibName | String | jib image name (defaults to project name) |
| jibVersion | String | jib version (defaults to version) |
| jibEnvironment | Map[String, String] | jib docker env variables |
| jibPlatforms | Set[Platform] | jib platforms |
| jibLabels | Map[String, String] | jib docker labels |
| jibTcpPorts | List[Int] | jib docker exposed tcp ports |
| jibUdpPorts | List[Int] | jib docker exposed udp ports |
| jibTags | List[String] | jib image tags (in addition to jibVersion) |
| jibUser | Option[String] | jib user and group to run the container as |
| jibMappings | Seq[(File, String)] | jib additional resource mappings, formatted as <source file resource> -> <full path on container> |
| jibExtraMappings | Seq[(File, String)] | jib extra file mappings / i.e. java agents (see above for formatting) |
| jibJavaAddToClasspath | List[File] | Adds other files to the class path when using jibJava*. Serves as replacement for jibMappings and jibExtraMappings which don't work there. |
| jibUseCurrentTimestamp | Boolean | jib use current timestamp for image creation time. Default to Epoch |
| jibCustomRepositoryPath | Option[String] | jib custom repository path freeform path structure. The default repo structure is organization/name |
| name | description |
|---|---|
| jibDockerBuild | jib build docker image |
| jibImageBuild | jib build image (does not need docker) |
| jibTarImageBuild | jib build tar image |
| jibJavaDockerBuild | jib build docker image, uses JavaContainerBuilder from jib-core |
| jibJavaImageBuild | jib build image (does not need docker), uses JavaContainerBuilder from jib-core |
| jibJavaTarImageBuild | jib build tar image, uses JavaContainerBuilder from jib-core |
There are a couple of ways to supply credentials to the image pull and push operations done by jib. The following sources are tested in order:
- Environment variables:
JIB_BASE_IMAGE_USERNAME+JIB_BASE_IMAGE_PASSWORDfor pulling the base image,JIB_TARGET_IMAGE_USERNAME+JIB_TARGET_IMAGE_PASSWORDfor pushing the target image - SBT credentials: The plugin looks for a
credentialsentry that matches the host of the image registry - The
$HOME/.docker/config.jsonfor credentials and credential helpers - A set of well known credential helpers
- The credential helpers supplied by
jibBaseImageCredentialHelperorjibTargetImageCredentialHelper
This snippet shows how to inject a Java Agent (Kanela) into a container via jibExtraMappings.
build.sbt
//...project stuff...
javaAgents += "io.kamon" % "kanela-agent" % "1.0.5" % "dist;runtime;compile"
//...project stuff...
jibBaseImage := "openjdk:11-jre"
jibName := "my-service"
jibRegistry := "some-ecr-repository"
jibUseCurrentTimestamp := true
jibCustomRepositoryPath := Some(jibName.value)
jibJvmFlags := List("-javaagent:/root/lib/kanela-agent.jar")
jibExtraMappings := {
//javaAgents, Modules and ResolvedAgent come from the sbt-javaagent plugin
val resolved = javaAgents.value.map { agent =>
update.value.matching(Modules.exactFilter(agent.module)).headOption map {
jar => ResolvedAgent(agent, jar)
}
}
for {
resolvedAgent <- resolved.flatten
} yield {
resolvedAgent.artifact -> s"/root/lib/${resolvedAgent.agent.name}.jar"
}
}
jibTargetImageCredentialHelper := Some("ecr-login")
jibBaseImageCredentialHelper := Some("ecr-login")