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

Правильный способ развертывания файлов WAR в изображении докеров

Что такое докерный способ развертывания Java-проектов в контейнере докеров?

Скопирую ли я войну в webapps:

FROM jetty:9.2.10
MAINTAINER Me "[email protected]"
ADD ./target/*.war /var/lib/jetty/webapps/ROOT.war

или я беру файл взорванного войны:

FROM jetty:9.2.10
MAINTAINER Me "[email protected]"
ADD ./target/app-0.1.0.BUILD-SNAPSHOT /var/lib/jetty/webapps/ROOT

Обычно можно было бы развернуть запечатанный военный файл, если он был обычным контейнером, но с докером, это означает, что каждый раз, когда вы делаете небольшое изменение, нужно нажимать файл 10-20 Мбайт, тогда как добавление взорванной войны будет только толкать разницу. который изменился.

Есть ли недостатки для развертывания взорванной войны вместо военного файла?

4b9b3361

Ответ 1

Интересно, как вы используете свои изображения. Добавление 20 МБ файла при создании изображения должно быть почти мгновенным. Mayb вы каким-то образом создаете изображения во время развертывания, например AWS, когда вы даете ему файл Docker.

В любом случае, я думаю, это зависит от того, как вы развертываете. Если вы перемещаете изображения вокруг себя, я не вижу большой разницы между добавлением файла .war и взорванным каталогом WAR. Я бы сказал, что вам удобно. Однако, если вы иногда запускаете приложение из Docker, а иногда из .war(что может пропустить часть точки Docker), вы также можете использовать .war все время.

Если вы развертываете что-то вроде AWS Elastic Beanstalk (что-то, что вытаскивает изображение из репозитория), которое хочет либо файл Dockerfile, либо файл Dockerrun.aws.json, тогда разделение изображения с тем, что вы фактически развертываете, делает некоторые (или это имело для меня смысл до сих пор). Это позволяет контейнеру оставаться неизменным, в то время как обновление вашего приложения может просто копировать файл .jar/.war в нужное место (что также может пропустить часть точки Docker;).

То, что я делал, это создание базового изображения на Docker Hub, а затем использование файла Dockerrun.aws.json для отображения в моем приложении. Таким образом, AWS не нужно создавать мой образ, просто потяните его. Это намного быстрее и дешевле ($). Но это отличает мое приложение от изображения, что может осложнить развертывание в некоторых случаях. Однако, поскольку мой образ настолько стабилен, я обычно просто связываю файл .jar, файл Dockerrun.aws.json и оболочку script в .zip и загружаю его в AWS. Довольно легко, я думаю.

My Dockerfile довольно прост и действительно все, что мне нужно для моего приложения Spring Boot:

FROM java:8
VOLUME /tmp
VOLUME /app
EXPOSE 8080
ENTRYPOINT ["sh","/app/app.sh"]

Вы можете сделать что-то подобное и использовать опцию -v и т.д., чтобы отображать тома в ваше приложение, настройки среды и т.д. BTW, это изображение доступен на Docker Hub.

Ответ 2

Вы действительно должны ВСЕГДА развертывать взорванный .war.

Здесь есть два элемента скорости:

  • Насколько быстро вы можете поднять изображение в хранилище контейнеров?

    и

  • Как быстро новый экземпляр моего контейнера начнет обслуживать запросы? (важно в среде с эластичным масштабированием)

Ответ на оба одинаковый: вам лучше взломать файл .war при создании контейнера и НЕ копировать в него файл .war.

Это имеет следующие два очень положительных эффекта:

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

Для тех из нас, кто обременен медленными подключениями, также неплохо использовать сервер CI или даже облачную VM для создания и перевода ваших изображений докеров в dockerhub или другой регистр контейнера. Таким образом, вы можете использовать скорость загрузки гигабитного масштаба.

Ответ 3

Вот как я это делаю:

FROM tomcat:8.0
MAINTAINER David Ford <[email protected]>
ENV DB_HOST mySqlServer
ENV DB_USER joeBlow
ENV DB_PASSWORD bla bla bla
EXPOSE 8080
RUN rm -fr /usr/local/tomcat/webapps/ROOT
COPY target/webapp /usr/local/tomcat/webapps/ROOT

В моем списке дел: выделите директорию WEB_INF/lib в свой собственный контейнер.

Ответ 4

Вы можете попробовать следующее: Скопируйте файл войны в контейнер с помощью COPY Скопируйте банку причала в контейнер с помощью COPY а затем используйте CMD, чтобы запустить его так [ "java -jar/path/to/jetty-runner.jar/path/to/app.war" ]

http://www.eclipse.org/jetty/documentation/current/runner.html

ПРИМЕЧАНИЕ. Вам нужно будет установить java в контейнер.