Скажем, у меня есть приложение
FROM openjdk:8-jre
COPY myapp.jar /
CMD ["java", "-jar", "/myapp.jar"]
Теперь я хочу использовать вашу технику, чтобы иметь обычного пользователя без полномочий root.Поэтому мне нужно изменить этот Dockerfile на
FROM my/openjdk:8-jre # <-- change the base image name
USER root # <-- change back to root for file installation
COPY myapp.jar ./
USER user # <-- use non-root user at runtime
CMD ["java", "-jar", "./myapp.jar"]
Далее, предположим, что есть проблема безопасности Java, и мне нужно обновить все до более новой JRE.Если я использую стандартный образ OpenJDK, мне просто нужно убедиться, что я docker pull
отредактировал более новый образ, а затем пересобрать образ своего приложения.Но если я использую ваше пользовательское промежуточное изображение, мне нужно сначала перестроить этот образ, а затем пересобрать приложение.Вот тут-то и возникает бремя обслуживания.
В моих изображениях Docker я склонен просто RUN adduser
и указать USER
в самом изображении.(Им не нужен домашний каталог или какая-либо конкретная оболочка, и у них определенно не должно быть зависимого от хоста идентификатора пользователя.) Если вы широко рассматриваете Dockerfile как имеющий три «части» - настройку зависимостей на уровне ОС, установкуприложение и определение параметров времени выполнения - я обычно помещаю это в первую часть.
FROM openjdk:8-jre # <-- standard Docker Hub image
RUN adduser user # <-- add the user as a setup step
WORKDIR /app
COPY myapp.jar . # <-- install files at root
USER user # <-- set the default runtime user
CMD ["java", "-jar", "/app/myapp.jar"]
(Скажем, ваше приложение имеет проблему безопасности. Если вы установили файлы как root и запускаете приложение как не-root, тогда злоумышленник не сможет перезаписать установленное приложение внутри контейнера.)