Docker — Java REST API без фреймворка

У меня есть проект Java RESTful API, в котором не используется какая-либо структура или управление проектами, такие как Maven или Gradle. Это всего лишь один файл .java, который компилируется и запускается.

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

Может кто-нибудь указать мне в правильном направлении?

P.S. Я не использую IDE; Я использую VSCode и его расширения Java.

Есть несколько примеров, использующих образ докера openJDK в качестве основы. Посмотрите здесь: hub.docker.com/_/openjdk

Cyril G. 21.03.2022 01:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Теоретически вам на самом деле нужен только контейнер с JVM (или соответствующими его частями) и один файл Java.

Создание приложения Java (замените Maven)

То, что вам нужно сделать по-другому, это компиляция/упаковка, поскольку у вас нет 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

JVM

Итак, теперь вы можете создать свое 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. Есть много вариантов.

  1. Начать с образа ОС

Вы можете начать с простого образа ОС, такого как Ubuntu или Alpine Linux, и установить JVM, используя, например, репозиторий apt, двоичные файлы или что-то еще, а затем создайте свой проект и запустите его, как показано выше.

  1. Начать с готового образа

Существуют небольшие предварительно созданные образы с JVM, уже готовые к использованию, например. Затмение-Термурин или OpenJDK, некоторые из которых на самом деле устарели, и вам нужно будет выбрать правильный тег для желаемой версии Java. Как объясняется на DockerHub для Eclipse Termurin, вы также можете создать свою собственную JVM, используя джлинк, что может дать вам еще меньший контейнер.

  1. Образы без дистрибутива

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

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

Как эта настройка докера выставит порт 8080 для использования с RESTful API?

darrenpw23 21.03.2022 02:04

Хорошая точка зрения. Вам нужно будет добавить EXPOSE 8080 в качестве команды в любом месте перед последним CMD. Затем в команду запуска добавьте docker run --rm --name my-container -p 8080:8080 test/java. Проверьте мое редактирование в Dockerfile.

Mushroomator 21.03.2022 02:09

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