Skip to content

Commit f87cad1

Browse files
committed
Publish distroless docker image (close #258)
1 parent 450c976 commit f87cad1

File tree

6 files changed

+97
-50
lines changed

6 files changed

+97
-50
lines changed

.github/workflows/lacework.yml

+8-1
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,20 @@ jobs:
2929
- name: Build docker images
3030
run: sbt docker:publishLocal
3131

32-
- name: Scan snowplow-s3-loader
32+
- name: Scan snowplow-s3-loader focal
3333
env:
3434
LW_ACCESS_TOKEN: ${{ secrets.LW_ACCESS_TOKEN }}
3535
LW_ACCOUNT_NAME: ${{ secrets.LW_ACCOUNT_NAME }}
3636
LW_SCANNER_SAVE_RESULTS: ${{ !contains(steps.version.outputs.tag, 'rc') }}
3737
run: ./lw-scanner image evaluate snowplow/snowplow-s3-loader ${{ steps.ver.outputs.tag }} --build-id ${{ github.run_id }} --no-pull
3838

39+
- name: Scan snowplow-s3-loader distroless
40+
env:
41+
LW_ACCESS_TOKEN: ${{ secrets.LW_ACCESS_TOKEN }}
42+
LW_ACCOUNT_NAME: ${{ secrets.LW_ACCOUNT_NAME }}
43+
LW_SCANNER_SAVE_RESULTS: ${{ !contains(steps.version.outputs.tag, 'rc') }}
44+
run: ./lw-scanner image evaluate snowplow/snowplow-s3-loader ${{ steps.ver.outputs.tag }}-distroless --build-id ${{ github.run_id }} --no-pull
45+
3946
- name: Scan snowplow-s3-loader lzo
4047
env:
4148
LW_ACCESS_TOKEN: ${{ secrets.LW_ACCESS_TOKEN }}

.github/workflows/test_and_publish.yml

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ jobs:
3939
if: startsWith(github.ref, 'refs/tags/')
4040
run: sbt 'project lzo' docker:publish
4141

42+
- name: Publish to Docker Hub distroless
43+
if: startsWith(github.ref, 'refs/tags/')
44+
run: sbt 'project distroless' docker:publish
45+
4246
- name: Build artifacts
4347
run: |
4448
sbt assembly

build.sbt

+13-40
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,28 @@
1414
*/
1515

1616
lazy val root = project.in(file("."))
17-
.aggregate(main, lzo)
17+
.aggregate(main, distroless, lzo)
1818

1919
lazy val main = project.in(file("modules/main"))
20+
.settings(BuildSettings.mainSettings)
2021
.settings(
21-
name := "snowplow-s3-loader",
22-
)
23-
.settings(BuildSettings.commonSettings)
24-
.settings(
25-
libraryDependencies ++= Seq(
26-
// Java
27-
Dependencies.Libraries.kinesisClient,
28-
Dependencies.Libraries.kinesisConnector,
29-
Dependencies.Libraries.slf4j,
30-
Dependencies.Libraries.jclOverSlf4j,
31-
Dependencies.Libraries.jackson,
32-
Dependencies.Libraries.sentry,
33-
// Scala
34-
Dependencies.Libraries.decline,
35-
Dependencies.Libraries.circe,
36-
Dependencies.Libraries.snowplowTracker,
37-
Dependencies.Libraries.snowplowBadrows,
38-
Dependencies.Libraries.pureconfig,
39-
Dependencies.Libraries.pureconfigCirce,
40-
// Scala (test only)
41-
Dependencies.Libraries.specs2,
42-
// Thrift (test only)
43-
Dependencies.Libraries.collectorPayload,
44-
Dependencies.Libraries.thrift % Test,
45-
),
46-
excludeDependencies += "commons-logging" % "commons-logging"
22+
libraryDependencies ++= Dependencies.mainDependencies,
23+
excludeDependencies ++= Dependencies.mainExclusions
4724
)
4825
.enablePlugins(JavaAppPackaging, DockerPlugin)
4926

50-
lazy val lzo = project.in(file("modules/lzo"))
27+
lazy val distroless = project.in(file("modules/distroless"))
28+
.settings(BuildSettings.distrolessSettings)
29+
.settings(sourceDirectory := (main / sourceDirectory).value)
5130
.settings(
52-
name := "snowplow-s3-loader-lzo",
31+
libraryDependencies ++= Dependencies.mainDependencies,
32+
excludeDependencies ++= Dependencies.mainExclusions
5333
)
54-
.settings(BuildSettings.commonSettings)
34+
.enablePlugins(JavaAppPackaging, DockerPlugin, LauncherJarPlugin)
35+
36+
lazy val lzo = project.in(file("modules/lzo"))
5537
.settings(BuildSettings.lzoSettings)
56-
.settings(
57-
libraryDependencies ++= Seq(
58-
Dependencies.Libraries.hadoop,
59-
Dependencies.Libraries.elephantbird,
60-
Dependencies.Libraries.hadoopLZO,
61-
Dependencies.Libraries.thrift,
62-
Dependencies.Libraries.collections,
63-
Dependencies.Libraries.jacksonCbor,
64-
)
65-
)
38+
.settings(libraryDependencies ++= Dependencies.lzoDependencies)
6639
.dependsOn(main % "compile->compile; test->test")
6740
.enablePlugins(JavaAppPackaging, DockerPlugin)
6841

project/BuildSettings.scala

+35-8
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@
1515
import sbt._
1616
import Keys._
1717

18-
import com.typesafe.sbt.packager.Keys._
19-
import com.typesafe.sbt.packager.docker.DockerPlugin.autoImport.Docker
20-
import com.typesafe.sbt.packager.docker._
18+
import com.typesafe.sbt.SbtNativePackager.autoImport._
19+
import com.typesafe.sbt.packager.archetypes.jar.LauncherJarPlugin.autoImport.packageJavaLauncherJar
20+
import com.typesafe.sbt.packager.docker.{Cmd, DockerPermissionStrategy}
21+
import com.typesafe.sbt.packager.docker.DockerPlugin.autoImport._
22+
import com.typesafe.sbt.packager.linux.LinuxPlugin.autoImport._
23+
import com.typesafe.sbt.packager.universal.UniversalPlugin.autoImport._
2124

2225
// Scoverage plugin
2326
import scoverage.ScoverageKeys._
@@ -47,21 +50,36 @@ object BuildSettings {
4750
}
4851
)
4952

50-
lazy val dockerSettings = Seq(
53+
lazy val dockerSettingsFocal = Seq(
5154
Docker / maintainer := "Snowplow Analytics Ltd. <[email protected]>",
5255
Docker / daemonUser := "daemon",
5356
Docker / packageName := "snowplow/snowplow-s3-loader",
5457
dockerBaseImage := "eclipse-temurin:11-jre-focal",
5558
dockerUpdateLatest := true,
5659
)
5760

58-
lazy val lzoDockerSettings = Seq(
61+
lazy val dockerSettingsDistroless = Seq(
62+
Docker / maintainer := "Snowplow Analytics Ltd. <[email protected]>",
63+
dockerBaseImage := "gcr.io/distroless/java11-debian11:nonroot",
64+
Docker / daemonUser := "nonroot",
65+
Docker / daemonGroup := "nonroot",
66+
dockerRepository := Some("snowplow"),
67+
Docker / daemonUserUid := None,
68+
Docker / defaultLinuxInstallLocation := "/home/snowplow",
69+
dockerEntrypoint := Seq("java", "-jar",s"/home/snowplow/lib/${(packageJavaLauncherJar / artifactPath).value.getName}"),
70+
dockerPermissionStrategy := DockerPermissionStrategy.CopyChown,
71+
dockerAlias := dockerAlias.value.withTag(Some(version.value + "-distroless")),
72+
dockerUpdateLatest := false
73+
)
74+
75+
lazy val lzoDockerSettingsFocal = dockerSettingsFocal ++ Seq(
5976
dockerCommands := {
6077
val installLzo = Seq(Cmd("RUN", "mkdir -p /var/lib/apt/lists/partial && apt-get update && apt-get install -y lzop && apt-get purge -y"))
6178
val (h, t) = dockerCommands.value.splitAt(dockerCommands.value.size-4)
6279
h ++ installLzo ++ t
6380
},
64-
dockerAlias := dockerAlias.value.withTag(Some(version.value + "-lzo"))
81+
dockerAlias := dockerAlias.value.withTag(Some(version.value + "-lzo")),
82+
dockerUpdateLatest := false
6583
)
6684

6785
// Makes our SBT app settings available from within the app
@@ -112,9 +130,18 @@ object BuildSettings {
112130
scalafmtOnCompile := false
113131
)
114132

115-
lazy val commonSettings = basicSettings ++ scalifySettings ++ sbtAssemblySettings ++ dockerSettings ++ addExampleConfToTestCp
133+
lazy val commonSettings = basicSettings ++ scalifySettings ++ sbtAssemblySettings ++ addExampleConfToTestCp
134+
135+
lazy val mainSettings = commonSettings ++ dockerSettingsFocal ++ Seq(
136+
name := "snowplow-s3-loader"
137+
)
138+
139+
lazy val distrolessSettings = commonSettings ++ dockerSettingsDistroless ++ Seq(
140+
name := "snowplow-s3-loader"
141+
)
116142

117-
lazy val lzoSettings = lzoDockerSettings ++ Seq(
143+
lazy val lzoSettings = commonSettings ++ lzoDockerSettingsFocal ++ Seq(
144+
name := "snowplow-s3-loader-lzo",
118145
Compile / discoveredMainClasses := Seq(),
119146
Compile / mainClass := Some("com.snowplowanalytics.s3.loader.lzo.Main")
120147
)

project/Dependencies.scala

+36
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,40 @@ object Dependencies {
9090
val specs2 = "org.specs2" %% "specs2-core" % V.specs2 % Test
9191
val collectorPayload = "com.snowplowanalytics" % "collector-payload-1" % V.collectorPayload % Test
9292
}
93+
94+
val mainDependencies = Seq(
95+
// Java
96+
Libraries.kinesisClient,
97+
Libraries.kinesisConnector,
98+
Libraries.slf4j,
99+
Libraries.jclOverSlf4j,
100+
Libraries.jackson,
101+
Libraries.sentry,
102+
// Scala
103+
Libraries.decline,
104+
Libraries.circe,
105+
Libraries.snowplowTracker,
106+
Libraries.snowplowBadrows,
107+
Libraries.pureconfig,
108+
Libraries.pureconfigCirce,
109+
// Scala (test only)
110+
Libraries.specs2,
111+
// Thrift (test only)
112+
Libraries.collectorPayload,
113+
Libraries.thrift % Test
114+
)
115+
116+
val lzoDependencies = Seq(
117+
Libraries.hadoop,
118+
Libraries.elephantbird,
119+
Libraries.hadoopLZO,
120+
Libraries.thrift,
121+
Libraries.collections,
122+
Libraries.jacksonCbor,
123+
)
124+
125+
val mainExclusions = Seq(
126+
"commons-logging" % "commons-logging"
127+
)
128+
93129
}

project/plugins.sbt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
addSbtPlugin("io.github.davidgregory084" % "sbt-tpolecat" % "0.1.18")
22
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10")
3-
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.8.1")
3+
addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.7")
44
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.2")
55
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.0")
66
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.1")

0 commit comments

Comments
 (0)