Приходилось ли вам писать Dockerfile?

Ответ

Да, для контейнеризации приложений. Dockerfile — это скрипт с инструкциями для сборки Docker-образа.

Типичная структура для Spring Boot приложения:

# 1. Базовый образ
FROM eclipse-temurin:17-jre-alpine

# 2. Установка рабочей директории внутри контейнера
WORKDIR /app

# 3. Копирование JAR-файла приложения (собранного Maven/Gradle)
COPY target/my-application.jar app.jar

# 4. Открытие порта, который слушает приложение
EXPOSE 8080

# 5. Команда для запуска приложения
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

Ключевые инструкции и best practices:

  • FROM: Выбор минимального официального образа (например, -alpine) для уменьшения размера.
  • COPY vs ADD: Предпочтительнее использовать COPY для простого копирования файлов.
  • Многоэтапная сборка: Для Java-приложений эффективно использовать multi-stage build, чтобы итоговый образ содержал только JRE и JAR-файл, без инструментов сборки.
  • Сборка и запуск:
    # Сборка образа с тегом
    docker build -t myapp:1.0 .
    # Запуск контейнера с пробросом порта
    docker run -p 8080:8080 myapp:1.0

Ответ 18+ 🔞

А, ну вот, подъехали к самому сочному, к этой вашей контейнеризации! Дакер, блядь! Ну, типа, чтобы твоё приложение, как эта самая Муму, не срало где попало, а жило в своём аккуратном домике-мешке, который потом можно хоть в озеро кинуть, если что.

Смотри сюда, вот тебе священный свиток, инструкция по сборке этого самого домика — Dockerfile. Для твоего Spring Boot-приложения это выглядит примерно как пиздец просто:

# 1. Берём фундамент, самый лёгкий, чтоб не тащить хуйню
FROM eclipse-temurin:17-jre-alpine

# 2. Говорим: "Вот тут, сука, внутри контейнера будем работать"
WORKDIR /app

# 3. Закидываем наш драгоценный JAR-файл, который Maven или Gradle нагенерили
COPY target/my-application.jar app.jar

# 4. Кричим на весь мир: "Я тут на порту 8080 слушаю, заходите!"
EXPOSE 8080

# 5. И главная команда, которая всё это запустит, когда контейнер оживёт
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

А теперь, блядь, разжёвываю, как для Герасима, который нихуя не говорит:

  • FROM: Это типа с какого завода кирпичи берём для домика. Бери самые лёгкие (-alpine), а то натащишь в образ всякой дичи, размер будет, как у слона, овердохуища.
  • COPY против ADD: Не умничай, просто копируй файлы через COPY. ADD — это такая хитрая жопа, которая ещё и архивы распаковывать умеет, но чаще всего нахуй не нужна.
  • Многоэтапная сборка (Multi-stage build): Вот это, блядь, высший пилотаж для Java. Смысл в чём: на первом этапе ты собираешь своё приложение со всеми этими Maven'ами, а на втором — забираешь только готовый JAR-файл и кидаешь его в чистенький образ с одним лишь JRE. Итог: образ маленький и аккуратный, а весь строительный мусор остался за бортом. Красота, ёпта!
  • Как этим пользоваться, чтобы не обосраться:
    # Собираем образ и даём ему метку (тег), чтоб не путать
    docker build -t myapp:1.0 .
    # А теперь запускаем этот самый контейнер, пробрасывая порт наружу
    docker run -p 8080:8080 myapp:1.0

Вот и вся магия. Собрал, запустил, и твоё приложение теперь, как та самая собачка, живёт в своём уютном изолированном мире. Только, в отличие от Герасима, топить его не придётся. Надеюсь.