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-образа.