# dockerfile-maven **Repository Path**: strong_git/dockerfile-maven ## Basic Information - **Project Name**: dockerfile-maven - **Description**: MATURE: A set of Maven tools for dealing with Dockerfiles - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Dockerfile Maven [![Build Status](https://travis-ci.com/spotify/dockerfile-maven.svg?branch=master)](https://travis-ci.com/spotify/dockerfile-maven) [![Maven Central](https://img.shields.io/maven-central/v/com.spotify/dockerfile-maven.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.spotify%22%20dockerfile-maven) [![License](https://img.shields.io/github/license/spotify/dockerfile-maven.svg)](LICENSE) ## Status: mature **At this point, we're not developing or accepting new features or even fixing non-critical bugs.** This Maven plugin integrates Maven with Docker. The design goals are: - Don't do anything fancy. `Dockerfile`s are how you build Docker projects; that's what this plugin uses. They are mandatory. - Make the Docker build process integrate with the Maven build process. If you bind the default phases, when you type `mvn package`, you get a Docker image. When you type `mvn deploy`, your image gets pushed. - Make the goals remember what you are doing. You can type `mvn dockerfile:build` and later `mvn dockerfile:tag` and later `mvn dockerfile:push` without problems. This also eliminates the need for something like `mvn dockerfile:build -DalsoPush`; instead you can just say `mvn dockerfile:build dockerfile:push`. - Integrate with the Maven build reactor. You can depend on the Docker image of one project in another project, and Maven will build the projects in the correct order. This is useful when you want to run integration tests involving multiple services. This project adheres to the [Open Code of Conduct][code-of-conduct]. By participating, you are expected to honor this code. See the [changelog for a list of releases][changelog] [code-of-conduct]: https://github.com/spotify/code-of-conduct/blob/master/code-of-conduct.md [changelog]: CHANGELOG.md ## Set-up This plugin requires Java 7 or later and Apache Maven 3 or later (dockerfile-maven-plugin <=1.4.6 needs Maven >= 3, and for other cases, Maven >= 3.5.2). To run the integration tests or to use the plugin in practice, a working Docker set-up is needed. ## Example For more examples, see the [integration test](./plugin/src/it) directory. In particular, the [advanced](./plugin/src/it/advanced) test showcases a full service consisting of two micro-services that are integration tested using `helios-testing`. This configures the actual plugin to build your image with `mvn package` and push it with `mvn deploy`. Of course you can also say `mvn dockerfile:build` explicitly. ```xml com.spotify dockerfile-maven-plugin ${dockerfile-maven-version} default build push spotify/foobar ${project.version} ${project.build.finalName}.jar ``` A corresponding `Dockerfile` could look like: ``` FROM openjdk:8-jre MAINTAINER David Flemström ENTRYPOINT ["/usr/bin/java", "-jar", "/usr/share/myservice/myservice.jar"] # Add Maven dependencies (not shaded into the artifact; Docker-cached) ADD target/lib /usr/share/myservice/lib # Add the service itself ARG JAR_FILE ADD target/${JAR_FILE} /usr/share/myservice/myservice.jar ``` **Important note** The most Maven-ish way to reference the build artifact would probably be to use the `project.build.directory` variable for referencing the 'target'-directory. However, this results in an absolute path, which is not supported by the ADD command in the Dockerfile. Any such source must be inside the *context* of the Docker build and therefor must be referenced by a *relative path*. See https://github.com/spotify/dockerfile-maven/issues/101 *Do **not** use `${project.build.directory}` as a way to reference your build directory.* ## What does it give me? There are many advantages to using this plugin for your builds. ### Faster build times This plugin lets you leverage Docker cache more consistently, vastly speeding up your builds by letting you cache Maven dependencies in your image. It also encourages avoiding the `maven-shade-plugin`, which also greatly speeds up builds. ### Consistent build lifecycle You no longer have to say something like: mvn package mvn dockerfile:build mvn verify mvn dockerfile:push mvn deploy Instead, it is simply enough to say: mvn deploy With the basic configuration, this will make sure that the image is built and pushed at the correct times. ### Depend on Docker images of other services You can depend on the Docker information of another project, because this plugin attaches project metadata when it builds Docker images. Simply add this information to any project: ```xml com.spotify foobar 1.0-SNAPSHOT docker-info ``` Now, you can read information about the Docker image of the project that you depended on: ```java String imageName = getResource("META-INF/docker/com.spotify/foobar/image-name"); ``` This is great for an integration test where you want the latest version of another project's Docker image. Note that you have to register a Maven extension in your POM (or a parent POM) in order for the `docker-info` type to be supported: ```xml com.spotify dockerfile-maven-extension ${version} ``` ## Use other Docker tools that rely on Dockerfiles Your project(s) look like so: ``` a/ Dockerfile pom.xml b/ Dockerfile pom.xml ``` You can now use these projects with Fig or docker-compose or some other system that works with Dockerfiles. For example, a `docker-compose.yml` might look like: ```yaml service-a: build: a/ ports: - '80' service-b: build: b/ links: - service-a ``` Now, `docker-compose up` and `docker-compose build` will work as expected. ## Usage See [usage docs](https://github.com/spotify/dockerfile-maven/blob/master/docs/usage.md). ## Authentication See [authentication docs](https://github.com/spotify/dockerfile-maven/blob/master/docs/authentication.md). ## Releasing To cut the Maven release: ``` mvn clean [-B -Dinvoker.skip -DskipTests -Darguments='-Dinvoker.skip -DskipTests'] \ -Dgpg.keyname= \ release:clean release:prepare release:perform ``` We use [`gren`](https://github.com/github-tools/github-release-notes#installation) to create Releases in Github: ``` gren release ```