У меня есть проект Java RESTful API, в котором не используется какая-либо структура или управление проектами, такие как Maven или Gradle. Это всего лишь один файл .java, который компилируется и запускается.
Мне было поручено докеризировать его, но я не могу найти никаких статей или руководств, показывающих, как это сделать в моем случае. Во всех статьях используются Spring и Maven.
Может кто-нибудь указать мне в правильном направлении?
P.S. Я не использую IDE; Я использую VSCode и его расширения Java.
Теоретически вам на самом деле нужен только контейнер с JVM (или соответствующими его частями) и один файл Java.
То, что вам нужно сделать по-другому, это компиляция/упаковка, поскольку у вас нет Maven. Но если у вас есть только один файл .java
и нет зависимостей, это довольно просто. Вы можете просто скомпилировать приложение с помощью javac
, а затем запустить его с помощью java
.
Вот краткое руководство для приложения HelloWorld, которое будет похоже на ваш проект: один файл .java
, никаких зависимостей.
Приложение.java
public class Application {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Используйте javac
, чтобы получить Application.class
javac Application.java
При желании теперь вы можете создать файл .jar
для своего приложения.
jar -cvf Application.jar Application.class
Когда у вас есть Application.class
, вы можете просто запустить его, используя java
.
java Application
или для файла .jar
java -jar Application.jar
Итак, теперь вы можете создать свое Java-приложение, единственный реальный вопрос заключается в том, с какого образа вы начинаете свой образ Docker. Вам нужен JVM
, чтобы запустить его, и javac
, чтобы построить его, больше ничего.
Вы можете использовать готовые образы, такие как затмение-термурин, тогда ваш образ Docker будет выглядеть примерно так. Здесь я использую свое маленькое приложение HelloWorld.
Note: This is using Java 11, you will need to do some adjustments for later Java versions.
Докерфайл
# Multi-stage docker build
# this is the image we are using to build the docker image
FROM eclipse-temurin:11 as builder
# make a folder for the build
RUN mkdir /opt/build
COPY Application.java /opt/build/Application.java
RUN javac /opt/build/Application.java
# this is the actual production docker image
FROM eclipse-temurin:11
ENV APP_HOME=/opt/app
# make a folder for the application
RUN mkdir ${APP_HOME}
# copy the built application over from the builder image
COPY --from=builder /opt/build/Application.class /opt/app/Application.class
# Not required for my application but your web server
# The next line exposes port 8080 (if uncommented)
# EXPOSE 8080
# this is run on docker run
CMD cd $APP_HOME && java Application
Используя этот файл Docker, вы сможете создать образ (когда вы находитесь в каталоге вашего файла Docker).
docker build -t test/java .
И последнее, но не менее важное: запустить его.
docker run --rm test/java
Для вашего веб-сервера вам также необходимо предоставить сопоставление портов, используя опцию -p
, например -p 8080:8080
.
Это напечатает
Hello World!
Соответствующая часть - это FROM
. Есть много вариантов.
Вы можете начать с простого образа ОС, такого как Ubuntu или Alpine Linux, и установить JVM, используя, например, репозиторий apt, двоичные файлы или что-то еще, а затем создайте свой проект и запустите его, как показано выше.
Существуют небольшие предварительно созданные образы с JVM, уже готовые к использованию, например. Затмение-Термурин или OpenJDK, некоторые из которых на самом деле устарели, и вам нужно будет выбрать правильный тег для желаемой версии Java. Как объясняется на DockerHub для Eclipse Termurin, вы также можете создать свою собственную JVM, используя джлинк, что может дать вам еще меньший контейнер.
Все вышеупомянутые варианты на самом деле являются большими или меньшими дистрибутивами Linux с работающей JVM, но также есть Distroless контейнеры, которые довольно малы, и для вашего приложения не установлена оболочка или другие ненужные вещи.
Есть также некоторые рекомендации по созданию хорошего контейнера Docker, которые сосредоточены на таких областях, как безопасность, размер изображения, кэширование и т. д., поэтому, безусловно, стоит изучить их, поскольку Dockerfile, который я показал вам, ни в коем случае не готов к работе, но он работает. и поможет вам начать.
Как эта настройка докера выставит порт 8080 для использования с RESTful API?
Хорошая точка зрения. Вам нужно будет добавить EXPOSE 8080
в качестве команды в любом месте перед последним CMD
. Затем в команду запуска добавьте docker run --rm --name my-container -p 8080:8080 test/java
. Проверьте мое редактирование в Dockerfile.
Есть несколько примеров, использующих образ докера openJDK в качестве основы. Посмотрите здесь: hub.docker.com/_/openjdk