Содержимое файла dockerfile для запуска сервера Glassfish и развертывания определенного приложения из репозитория git

Я пытаюсь развернуть свое приложение java ee, используя сервер glassfish 4.1, и я хотел бы развернуть его как контейнер Docker.

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

В настоящее время я могу создать Docker-контейнер, запускающий сервер Glassfish, со следующим Dockerfile:

FROM        java:8-jdk

ENV         JAVA_HOME         /usr/lib/jvm/java-8-openjdk-amd64
ENV         GLASSFISH_HOME    /usr/local/glassfish4
ENV         PATH              $PATH:$JAVA_HOME/bin:$GLASSFISH_HOME/bin

RUN         apt-get update && \
            apt-get install -y curl unzip zip inotify-tools && \
            rm -rf /var/lib/apt/lists/*

RUN         curl -L -o /tmp/glassfish-4.1.zip http://download.java.net/glassfish/4.1/release/glassfish-4.1.zip && \
            unzip /tmp/glassfish-4.1.zip -d /usr/local && \
            rm -f /tmp/glassfish-4.1.zip

EXPOSE      8080 4848 8181

WORKDIR     /usr/local/glassfish4

# verbose causes the process to remain in the foreground so that docker can track it
CMD         asadmin start-domain --verbose

Затем я создаю контейнер Docker (с именем "myglassfish")

docker build -t myglassfish .

Наконец, я запускаю glassfish на моем порту 8080, используя следующую командную строку:

docker run -d -ti -p 4848:4848 -p 8080:8080 myglassfish

Сервер Glassfish правильно запущен, потому что я вижу следующую информацию, нажав "localhost:8080" в моем браузере:

"Ваш сервер сейчас работает..." (я не могу отобразить скриншот)

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

Давайте рассмотрим самый простой пример. Предположим, я хочу развернуть мою войну с именем myapp.war (по пути /path1/path2/myapp.war) на моем сервере. Правильный ли следующий файл Docker (просто добавьте "CMD asadmin deploy..." в конце файла Docker)?

FROM        java:8-jdk

ENV         JAVA_HOME         /usr/lib/jvm/java-8-openjdk-amd64
ENV         GLASSFISH_HOME    /usr/local/glassfish4
ENV         PATH              $PATH:$JAVA_HOME/bin:$GLASSFISH_HOME/bin

RUN         apt-get update && \
            apt-get install -y curl unzip zip inotify-tools && \
            rm -rf /var/lib/apt/lists/*

RUN         curl -L -o /tmp/glassfish-4.1.zip http://download.java.net/glassfish/4.1/release/glassfish-4.1.zip && \
            unzip /tmp/glassfish-4.1.zip -d /usr/local && \
            rm -f /tmp/glassfish-4.1.zip

EXPOSE      8080 4848 8181

WORKDIR     /usr/local/glassfish4

# verbose causes the process to remain in the foreground so that docker can track it
CMD         asadmin start-domain --verbose
CMD         asadmin deploy /path1/path2/myapp.war

Если нет, то как мне изменить предыдущий Dockerfile для загрузки и развертывания моего приложения на сервере Glassfish перед его запуском (я указываю, что я новичок в инструкциях по Linux и командной строке, поэтому, пожалуйста, будьте явными в ваших ответах)?

РЕДАКТИРОВАТЬ

Теперь я могу развернуть мой war-файл из моего GIT-репозитория, используя следующий Dockerfile:

FROM        java:8-jdk

MAINTAINER  firstname name <firstname.name@domain.com>

ENV         JAVA_HOME         /usr/lib/jvm/java-8-openjdk-amd64
ENV         GLASSFISH_HOME    /usr/local/glassfish4
ENV         PATH              $PATH:$JAVA_HOME/bin:$GLASSFISH_HOME/bin

RUN         apt-get update && \
            apt-get install -y curl unzip zip inotify-tools && \
            rm -rf /var/lib/apt/lists/*

#download and install the glassfish server
RUN         curl -L -o /tmp/glassfish-4.1.zip http://download.java.net/glassfish/4.1/release/glassfish-4.1.zip && \
            unzip /tmp/glassfish-4.1.zip -d /usr/local && \
            rm -f /tmp/glassfish-4.1.zip

#clone and deploy the project on the glassfish server
RUN     git clone http://myrepository.git /usr/local/mypath
RUN     cp /usr/local/mypath/MyProject/MyProject.war /usr/local/glassfish4/glassfish/domains/domain1/autodeploy/MyProject.war

EXPOSE      8080 4848 8181

WORKDIR     /usr/local/glassfish4

# verbose causes the process to remain in the foreground so that docker can track it
CMD         asadmin start-domain --verbose

Это прекрасно работает (используя сборку Docker и запуск Docker), но я бы хотел динамически создавать мой war-файл, а не напрямую копировать существующий war-файл в мой репозиторий.

Я попробовал командную строку 'jar -cvf', чтобы создать военный архив из репозитория, но каталог 'classes', содержащий все скомпилированные классы java.class, отсутствует в войне. Как следствие, созданный файл войны не может быть развернут. Поскольку скомпилированный класс.class отсутствует в моем GIT-репозитории, как я могу их получить (я пробовал команду 'javac', но большинство классов не определяет основной метод)? Конкретно, мне просто нужно добавить все скомпилированные классы.class в каталог 'classes' в моей WAR. Должен ли я использовать репозиторий Maven для этого?

Спасибо заранее!

2 ответа

Наилучший подход (на мой взгляд) - создать новый образ, который будет исходить из вашего изображения "myglassfish" и включать файл WAR. Это изображение будет иметь тег, который соответствует версии выпуска приложения. Я надеюсь, что файл WAR был выпущен в репозиторий Maven, из которого вы можете скачать его во время сборки образа. Если файл WAR находится в вашей локальной файловой системе, просто скопируйте его в образ. И последнее: если у вас возникли проблемы с совместным использованием файлов с вашего компьютера и с виртуальной машины boot2docker, boot2docker автоматически открывает общий доступ к папке "Пользователи" на виртуальной машине. Я надеюсь, что я был полезным. Если у вас есть еще вопросы, просто стреляйте.

Вы можете смонтировать локальный каталог, содержащий ваше веб-приложение (ваш git-проект), как том в контейнер. Подобно:

docker run -d -ti -v your/project/folder:/path/to/webapp/directory -p 4848:4848 -p 8080:8080 myglassfish

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

Более подробную информацию вы можете найти в объемной документации.

Другие вопросы по тегам