Подтвердить что ты не робот

Как докерезировать проект maven? и сколько способов это сделать?

Я новичок в Docker и не знаю, как запустить java-проект с maven, хотя я прочитал много документов и пробовал много методов.

  • Должен ли я создать изображение с помощью Dockerfile?
  • Что такое команды, например, когда нужно запустить проект maven в хосте с Dockerfile?
4b9b3361

Ответ 1

Попробуйте использовать новые официальные изображения, там один для Maven

https://registry.hub.docker.com/_/maven/

Изображение может использоваться для запуска Maven во время сборки для создания скомпилированного приложения или, как в следующих примерах, для запуска сборки Maven внутри контейнера.

Пример 1 - Maven, выполняющийся внутри контейнера

Следующая команда запускает вашу сборку Maven внутри контейнера:

docker run -it --rm \
       -v "$(pwd)":/opt/maven \
       -w /opt/maven \
       maven:3.2-jdk-7 \
       mvn clean install

Примечания:

  • Оптимальная вещь в этом подходе заключается в том, что все программное обеспечение установлено и запущено в контейнере. Только требуется докер на главной машине.
  • Смотрите Dockerfile для этой версии

Пример 2 - Использование Nexus для кэширования файлов

Запустите контейнер Nexus

docker run -d -p 8081:8081 --name nexus sonatype/nexus

Создайте файл settings.xml:

<settings>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://nexus:8081/content/groups/public/</url>
    </mirror>
  </mirrors>
</settings>

Теперь запустите Maven, привязав к контейнеру нексуса, чтобы зависимости были кэшированы

docker run -it --rm \
       -v "$(pwd)":/opt/maven \
       -w /opt/maven \
       --link nexus:nexus \
       maven:3.2-jdk-7 \
       mvn -s settings.xml clean install

Примечания:

  • Преимущество работы Nexus в фоновом режиме заключается в том, что другие сторонние репозитории могут управляться через URL-адрес администратора прозрачно для сборки Maven, работающей в локальных контейнерах.

Ответ 2

Там может быть много способов. Но я реализовал следующие два пути.

Данный пример относится к проекту maven.

1. Использование Dockerfile в проекте maven

Используйте следующую структуру файла:

Demo
└── src
|    ├── main
|    │   ├── java
|    │       └── org
|    │           └── demo
|    │               └── Application.java
|    │   
|    └── test
|
├──── Dockerfile
├──── pom.xml

И обновите файл Docker как:

FROM java:8
EXPOSE 8080
ADD /target/demo.jar demo.jar
ENTRYPOINT ["java","-jar","demo.jar"]

Перейдите в папку проекта и введите следующую команду: le для создания изображения и запуска этого изображения:

$ mvn clean
$ mvn install
$ docker build -f Dockerfile -t springdemo .
$ docker run -p 8080:8080 -t springdemo

Получить видео в Spring Загрузка с Docker

2. Использование плагинов Maven

Добавьте данный плагин maven в pom.xml

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.5</version>
        <configuration>
            <imageName>springdocker</imageName>
            <baseImage>java</baseImage>
            <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
            <resources>
                <resource>
                    <targetPath>/</targetPath>
                    <directory>${project.build.directory}</directory>
                    <include>${project.build.finalName}.jar</include>
                </resource>
            </resources>
        </configuration>
    </plugin>

Перейдите в папку проекта и введите следующую команду: вы сможете создать изображение и запустить это изображение:

$ mvn clean package docker:build
$ docker images
$ docker run -p 8080:8080 -t <image name>

В первом примере мы создаем Dockerfile и предоставляем базовое изображение и добавляем jar так, после этого мы будем запускать команду docker для создания изображения с определенным именем и затем запускать это изображение.

В то время как во втором примере мы используем плагин maven, в котором мы предоставляем baseImage и imageName, поэтому нам не нужно создавать Dockerfile здесь. После упаковки проекта maven мы получим изображение докера, и нам просто нужно запустите это изображение..

Ответ 3

Как правило, вы должны создать fat JAR, используя Maven (JAR, который содержит как ваш код, так и все зависимости).

Затем вы можете написать Dockerfile, который соответствует вашим требованиям (если вы можете построить толстый JAR, вам понадобится только базовая ОС, например CentOS и JVM).

Это то, что я использую для приложения Scala (которое основано на Java).

FROM centos:centos7

# Prerequisites.

RUN yum -y update
RUN yum -y install wget tar

# Oracle Java 7

WORKDIR /opt

RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u71-b14/server-jre-7u71-linux-x64.tar.gz
RUN tar xzf server-jre-7u71-linux-x64.tar.gz
RUN rm -rf server-jre-7u71-linux-x64.tar.gz
RUN alternatives --install /usr/bin/java java /opt/jdk1.7.0_71/bin/java 1

# App

USER daemon

# This copies to local fat jar inside the image
ADD /local/path/to/packaged/app/appname.jar /app/appname.jar

# What to run when the container starts
ENTRYPOINT [ "java", "-jar", "/app/appname.jar" ]

# Ports used by the app
EXPOSE 5000

Это создает образ на основе CentOS с Java7. Когда он будет запущен, он выполнит вашу банку приложений.

Лучший способ развернуть его - через реестр Docker, он похож на изображения Github для Docker.

Вы можете создать изображение следующим образом:

# current dir must contain the Dockerfile
docker build -t username/projectname:tagname .

Затем вы можете нажать изображение таким образом:

docker push username/projectname # this pushes all tags

Как только изображение находится в реестре докеров, вы можете вытащить его из любой точки мира и запустить его.

Подробнее см. Руководство пользователя Docker.

Что-то иметь в виду:

Вы также можете вытащить репозиторий внутри изображения и создать банку как часть выполнения контейнера, но это не очень хороший подход, поскольку код может измениться, и вы можете в конечном итоге использовать другую версию приложения без уведомления.

Создание жировой банки устраняет эту проблему.