= Docker
:page-aliases: Plugin_Docker.adoc

Automatically build docker images from your mill project.

Requires the docker CLI to be installed.

In the simplest configuration just extend `DockerModule` and declare a `DockerConfig` object.

.`build.mill`
[source,scala]
----
//| mvnDeps: ["com.lihaoyi::mill-contrib-docker:$MILL_VERSION"]

package build
import mill.*, scalalib.*

import contrib.docker.DockerModule

object foo extends JavaModule with DockerModule {
  object docker extends DockerConfig
}
----

Then

[source,console]
----
$ mill foo.docker.build
$ docker run foo
----

== Configuration

Configure the image by overriding tasks in the `DockerConfig` object

[source,scala]
----
object docker extends DockerConfig {
  // Override tags to set the output image name
  def tags = List("aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository")

  def baseImage = "openjdk:11"

  // Configure whether the docker build should check the remote registry for a new version of the base image before building.
  // By default this is true if the base image is using a latest tag
  def pullBaseImage = true
  // Add container metadata via the LABEL instruction
  def labels = Map("version" -> "1.0")
  // TCP ports the container will listen to
  def exposedPorts = Seq(8080, 443)
  // UDP ports the container will listen to
  def exposedUdpPorts = Seq(80)
  // The names of mount points, these will be translated to VOLUME instructions
  def volumes = Seq("/v1", "/v2")
  // Environment variables to be set in the container (ENV instructions)
  def envVars = Map("foo" -> "bar", "foobar" -> "barfoo")
  // JVM runtime options such as heap size settings
  def jvmOptions = Seq("-Xmx1024M", "-XX:+HeapDumpOnOutOfMemoryError")
  // Add RUN instructions
  def run = Seq(
    "/bin/bash -c 'echo Hello World!'",
    "useradd -ms /bin/bash new-user"
  )
  // User to use when running the image
  def user = "new-user"
  // Optionally override the docker executable to use something else
  def executable = "podman"
  // If the executable is docker (which is also the default), you can optionally also pass a platform parameter
  // docker buildx is then used to build multi-platform images
  def platform = "linux/arm64"
}
----


Run mill in interactive mode to see the docker client output, like `mill -i foo.docker.build`.
