Содержимое файла 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
Ключевое слово, которое вы можете использовать в Dockerfile
s.
Более подробную информацию вы можете найти в объемной документации.