Search code examples
scaladockerplayframeworksbt-native-packager

How to use docker task with a sbt multi project


I have a SBT multi project where I have 2 different play applications. I want to create 2 docker outputs not just 1.

In my build.sbt file I have some docker settings, but when I run the docker task it doesn't use any of these settings as the DockerFile doesn't have any of the things I configured.

My build.sbt looks like:

lazy val project1 = (project in file("project1")).
      ..
      .enablePlugins(...., DockerPlugin)

lazy val project2 = (project in file("project2")).
      ..
      .enablePlugins(...., DockerPlugin)


// docker
maintainer in Docker := "mr. docker"

dockerExposedPorts := Seq(9000)

dockerBaseImage := "java:latest"

I run the task by first going into my specific project:

project project2
docker:stage

The generated docker file in target/docker/Dockerfile is:

FROM java:latest
WORKDIR /opt/docker
ADD opt /opt
RUN ["chown", "-R", "daemon:daemon", "."]
USER daemon
ENTRYPOINT ["bin/project1"]
CMD []

As you can see it is missing what I put in my build.sbt. It should have lines for the maintainer and exposed ports.

How can I fix this problem?


Solution

  • Docker settings have to be set per sub-project:

    lazy val server = Project("server")
      .enablePlugins(DockerPlugin)
      .settings(dockerBaseImage := "openjdk:8-jdk")
      .settings(dockerRepository := Some("registry.gitlab.com"))
      .settings(dockerExposedPorts := Seq(8080))
    

    Having project defined as above, you can publish docker image with following command:

    sbt server/docker:publishLocal