Провести ревью Dockerfile приложения

37. Провести ревью Dockerfile приложения

Условие задачи:

Дан Dockerfile Java-приложения.

Необходимо провести ревью и определить, есть ли в нём проблемы.

Код:

FROM openjdk:11-jre-slim

RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean

RUN chmod 777 /tmp

WORKDIR /app

COPY hr1.jar /app/hr1.jar
RUN chmod 777 /app/hr1.jar

USER root

EXPOSE 8080

ENTRYPOINT ["java", "-Xms512m", "-Xmx256m", "-jar", "hr1.jar"]

Спойлеры к решению

Подсказки

💡 Сравните значения -Xms и -Xmx.

💡 Нужно ли Java-приложению запускаться от пользователя root?

💡 Обратите внимание на права 777.

💡 Несколько последовательных RUN можно объединить в один слой.


Решение

В Dockerfile есть несколько проблем.

Главная ошибка находится в настройке JVM:

-Xms512m
-Xmx256m

Начальный размер heap больше максимального. JVM не сможет запуститься с такой конфигурацией.

Например, можно указать:

-Xms256m
-Xmx512m

Также есть другие проблемы:

  • приложение запускается от root;

  • USER root здесь избыточен, поскольку по умолчанию контейнер и так запускается от root;

  • права 777 для /tmp и jar избыточны и небезопасны;

  • jar не требуется делать исполняемым, поскольку он запускается через java -jar;

  • apt-get update, install и очистку лучше выполнять в одном RUN;

  • после установки пакетов желательно удалить /var/lib/apt/lists/*, чтобы не увеличивать размер образа;

  • если curl приложению не нужен во время работы, его вообще лучше не устанавливать.

Исправленный вариант может выглядеть так:

FROM openjdk:11-jre-slim

RUN apt-get update \
    && apt-get install -y --no-install-recommends curl \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY hr1.jar hr1.jar

RUN useradd -r appuser \
    && chown -R appuser:appuser /app

USER appuser

EXPOSE 8080

ENTRYPOINT ["java", "-Xms256m", "-Xmx512m", "-jar", "hr1.jar"]

Если curl не используется приложением, блок его установки можно удалить полностью:

FROM openjdk:11-jre-slim

WORKDIR /app

COPY hr1.jar hr1.jar

RUN useradd -r appuser \
    && chown -R appuser:appuser /app

USER appuser

EXPOSE 8080

ENTRYPOINT ["java", "-Xms256m", "-Xmx512m", "-jar", "hr1.jar"]

Основная критическая проблема исходного варианта — -Xms512m при -Xmx256m. Остальные изменения улучшают безопасность и уменьшают размер Docker-образа.