позволяет выполнить сборку Docker образа, включив в него результат билда Maven.
docker-maven-plugin
Например — вы собираете веб-приложение в виде war-файла, который потом добавляется в Docker образ с Tomcat, и вы получаете готовое к использованию приложение без необходимости сборки Docker отдельно.
- Ручная сборка Docker образа с Java приложением
- Сборка с docker-maven-plugin
- Push в Docker Hub с docker-maven-plugin
Содержание
Ручная сборка Docker образа с Java приложением
За пример возьмём Java «Hello, World«:
$ git clone [email protected]:setevoy2/tests.git Cloning into 'tests'... remote: Counting objects: 15, done. remote: Compressing objects: 100% (11/11), done. remote: Total 15 (delta 0), reused 15 (delta 0), pack-reused 0 Receiving objects: 100% (15/15), done. Checking connectivity... done.
Сначала соберём приложение, Docker-образ, запустим и проверим.
Собираем:
$ cd tests/javahello/ $ ls -l total 12 -rw-rw-r-- 1 setevoy setevoy 723 жов 20 16:37 pom.xml drwxrwxr-x 3 setevoy setevoy 4096 жов 20 16:37 src drwxrwxr-x 4 setevoy setevoy 4096 жов 20 16:37 target $ mvn clean package Warning: JAVA_HOME environment variable is not set. [INFO] Scanning for projects... ... [INFO] Building war: /home/setevoy/Work/RTFM/tmp/tests/javahello/target/javahello.war [INFO] WEB-INF/web.xml already added, skipping [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.026s [INFO] Finished at: Thu Oct 20 16:50:26 EEST 2016 [INFO] Final Memory: 9M/236M [INFO] ----------------------
Проверяем:
$ ls -l target/ total 16 drwxrwxr-x 4 setevoy setevoy 4096 жов 20 16:50 javahello -rw-rw-r-- 1 setevoy setevoy 2199 жов 20 16:50 javahello.war drwxrwxr-x 2 setevoy setevoy 4096 жов 20 16:50 maven-archiver drwxrwxr-x 2 setevoy setevoy 4096 жов 20 16:50 surefire
Проверяем образ Tomcat:
$ sudo docker run -tid dordoka/tomcat 41de280f32a4a27613d556c0c6a1671428b89b5457bf927f053ba7fbbdee8d93 $ sudo docker exec -ti 41de280f32a4a27613d556c0c6a1671428b89b5457bf927f053ba7fbbdee8d93 bash root@41de280f32a4:/opt/tomcat# ps aux | grep tomcat root 1 10.1 0.6 7418096 107256 ? Ssl+ 08:46 0:03 /usr/lib/jvm/java-8-oracle/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/opt/tomcat/endorsed -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start root@41de280f32a4:/opt/tomcat# ls -l webapps/ total 8 drwxr-xr-x 5 root root 4096 Sep 27 08:08 host-manager drwxr-xr-x 5 root root 4096 Sep 27 08:08 manager
Готовим Dockerfile для сборки образа из Tomcat, в который добавим созданный артефакт:
FROM dordoka/tomcat COPY target/*.war /opt/tomcat/webapps/ EXPOSE 8080 CMD ["/opt/tomcat/bin/catalina.sh", "run"]
Собираем:
$ sudo docker build -t setevoy/tomcat_hello:2.2 . Sending build context to Docker daemon 17.41 kB Sending build context to Docker daemon Step 0 : FROM dordoka/tomcat ---> 1a07d4f8130b Step 1 : COPY target/javahello.war /opt/tomcat/webapps/ ---> 466b1ef50d22 Removing intermediate container 362d0b0819fe Step 2 : EXPOSE 8080 ---> Running in 1d219440ebb0 ---> da873ee28eac Removing intermediate container 1d219440ebb0 Step 3 : CMD /opt/tomcat/bin/catalina.sh run ---> Running in e2b76d60f053 ---> b52ade253209 Removing intermediate container e2b76d60f053 Successfully built b52ade253209
Проверяем:
$ sudo docker run -ti b52ade253209 bash root@15e58351374c:/opt/tomcat# ls -l webapps/ total 12 drwxr-xr-x 5 root root 4096 Sep 27 08:08 host-manager -rw-rw-r-- 1 root root 2199 Oct 20 13:50 javahello.war drwxr-xr-x 5 root root 4096 Sep 27 08:08 manager
Запускаем и получаем IP контейнера:
$ sudo docker run -tid b52ade253209
59da60cdd29dc46641c30b898d61f58a213c740449bf33e7a90fe2650bf334a0
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59da60cdd29d b52ade253209:latest "/opt/tomcat/bin/cat 9 seconds ago Up 8 seconds 8009/tcp, 8080/tcp boring_payne
$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' 59da60cdd29d
172.17.0.59
Проверяем работу приложения:
$ curl 172.17.0.59:8080/javahello/ <html> <body> <h2>Hello World!</h2> </body> </html>
Готово.
Сборка с docker-maven-plugin
Сейчас pom.xml выглядит так
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.setevoy.javahello</groupId>
<artifactId>javahello</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>javahello Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
</dependencies>
<build>
<finalName>javahello</finalName>
</build>
</project>
Обновляем блок build:
...
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.10</version>
<configuration>
<dockerDirectory>${project.basedir}</dockerDirectory>
<imageName>setevoy/${project.artifactId}</imageName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
Тут мы добавили выполнение build цели плагина docker-maven-plugin (docker:build) во время выполнения фазы package из Maven цикла.
С помощью элемента dockerDirectory мы так же указали искать Dockerfile в корне каталога проекта, и имя образа как setevoy/javahello с помощью переменной project.artifactId.
Собираем:
$ sudo mvn clean package Warning: JAVA_HOME environment variable is not set. [INFO] Scanning for projects... [INFO] ... [INFO] --- docker-maven-plugin:0.4.10:build (default) @ javahello --- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. [INFO] Copying /home/setevoy/Work/RTFM/tmp/tests/javahello/src/main/webapp/WEB-INF/web.xml -> /home/setevoy/Work/RTFM/tmp/tests/javahello/target/docker/src/main/webapp/WEB-INF/web.xml ... [INFO] Copying /home/setevoy/Work/RTFM/tmp/tests/javahello/.pom.xml.swp -> /home/setevoy/Work/RTFM/tmp/tests/javahello/target/docker/.pom.xml.swp [INFO] Building image setevoy/javahello Step 0 : FROM dordoka/tomcat ---> 1a07d4f8130b Step 1 : COPY target/*.war /opt/tomcat/webapps/ ---> 28bbe8afcaba Removing intermediate container 4f36f23af7f3 Step 2 : EXPOSE 8080 ---> Running in a74ae68dd876 ---> 43f85a320845 Removing intermediate container a74ae68dd876 Step 3 : CMD /opt/tomcat/bin/catalina.sh run ---> Running in b368b7c3f29a ---> 17d52f8ceb09 Removing intermediate container b368b7c3f29a Successfully built 7161e094ece3 [INFO] Built setevoy/javahello [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS
Проверяем:
$ sudo docker run -tid 7161e094ece3
a3ad18e8fe311022e718e6907ca20431897eb8393a046cf6e7adb2abff04f14d
$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' a3ad18e8fe311022e718e6907ca20431897eb8393a046cf6e7adb2abff04f14d
172.17.0.72
$ curl -L 172.17.0.72:8080/javahello-1.0
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
Push в Docker Hub с docker-maven-plugin
Последним шагом — требуется сохранить собарнный образ в Docker Hub.
В pom.xml, в блоке configurations добавляем:
... <serverId>docker-hub</serverId> <pushImage>true</pushImage> ...
Приведя его к таком увиду:
...
<configuration>
<dockerDirectory>${project.basedir}</dockerDirectory>
<imageName>setevoy/${project.artifactId}</imageName>
<serverId>docker-hub</serverId>
<pushImage>true</pushImage>
</configuration>
...
Создаём файл maven-settings.xml с параметрами для serverId == docker-hub:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>docker-hub</id>
<username>username</username>
<password>password</password>
<configuration>
<email>[email protected]</email>
</configuration>
</server>
</servers>
</settings>
Собираем:
$ sudo mvn clean package docker:build -s maven-settings.xml Warning: JAVA_HOME environment variable is not set. [INFO] Scanning for projects... ... [INFO] Building image setevoy/javahello Step 0 : FROM dordoka/tomcat ---> 1a07d4f8130b Step 1 : COPY target/javahello-1.0.war /opt/tomcat/webapps/ ---> e101dbe5375e Removing intermediate container 506a452b6fd6 Step 2 : EXPOSE 8080 ---> Running in 1e7dc21c6e98 ---> ad0fcf293e96 Removing intermediate container 1e7dc21c6e98 Step 3 : CMD /opt/tomcat/bin/catalina.sh run ---> Running in f723508118ac ---> d96a1562868d Removing intermediate container f723508118ac Successfully built d96a1562868d [INFO] Built setevoy/javahello [INFO] Pushing setevoy/javahello The push refers to a repository [setevoy/javahello] (len: 1) d96a1562868d: Image already exists ad0fcf293e96: Image successfully pushed ... Digest: sha256:bbf123c932ddb4b46f758f0d9a931c592017fdaf8b0d75c3aa759184a9c28055 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 5:24.729s [INFO] Finished at: Fri Oct 21 13:21:55 EEST 2016
Проверяем:
$ sudo docker search setevoy/javahello NAME DESCRIPTION STARS OFFICIAL AUTOMATED setevoy/javahello 0
Готово.
Ссылки по теме:
https://github.com/spotify/docker-maven-plugin
https://www.alooma.com/blog/building-dockers
http://www.disasterarea.co.uk/blog/building-tagging-and-pushing-docker-images-with-maven/




