Docker Приложение Jetty без разрешения записи на подключенный том - PullRequest
1 голос
/ 22 февраля 2020

извините за глупый вопрос, я очень новичок с Docker. Я пытаюсь развернуть мое приложение Java в официальном контейнере Jetty docker, все работает нормально, но когда мое приложение пытается записать файл на подключенный том, у него нет разрешения, поскольку папка назначения принадлежит root пользователь, но причал работает как пользователь jetty . Как я могу запустить сервер Jetty под именем root, чтобы дать моему приложению все необходимые разрешения?

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Как запустить сервер Jetty с именем root, чтобы дать моему приложению все необходимые разрешения?

Укажите пользователя при запуске контейнера:

docker run -d --user root:root --name jetty -v ... jetty:jdk13

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

Я очень новичок с Docker.

Начинающим или опытным, когда вы хотите "поиграть" с пользователем / томами на изображении, которое вы не делаете. Не знаю, эмпирическое правило читает документацию . Если этого недостаточно, вы все равно можете покопаться в его DockerFile.
В do c вы можете прочитать:

По умолчанию это изображение начинается как пользователь root и использует Jetty's. Модуль setuid для сброса привилегий пользователю после инициализации. Каталог JETTY_BASE в / var / lib / jetty принадлежит jetty: jetty (uid 999, gid 999).

На самом деле это не является исчерпывающим. Все каталоги, используемые Jetty в контейнерах, принадлежат Jetty:

Среда Jetty по умолчанию на изображении:

JETTY_HOME = / usr / local / jetty

JETTY_BASE = / var / lib / jetty

TMPDIR = / tmp / jetty

Хотя это будет работать, если вы смонтируете / привязываетесь к этому каталогу, это выглядит как хак, потому что они не предназначены для хранения данных приложения.
Здесь более чистый подход заключается в настройке изображения для добавления в него папки, предназначенной для хранения данных приложения.
Это не сложно.

1) Создайте DockerFile для настроенного изображения пристани.
Например my-jetty-DockerFile:

FROM jetty:jdk13
VOLUME my-app-data
RUN mkdir my-app-data
RUN chown jetty:jetty my-app-data

2) Создайте это изображение:

docker build -t jetty-with-data-vol:jdk13 -f my-jetty-DockerFile . 

3) Запустите контейнер этого образа с подключенным томом:

docker run -d  --name my-jetty -v jetty-vol:/my-app-data jetty-with-data-vol:jdk13 
1 голос
/ 22 февраля 2020

Первый подход

Смена владельца папки, с которой вы пытаетесь работать * chown jetty:jetty path

Второй Apporach

Добавление пристани к sudoers, чтобы пристань могла иметь доступ в root папки с usermod -aG sudo jetty

Оба подхода должны быть внутри контейнера, так как вы не используете настраиваемый файл dockerfile. Получите ваш контейнерный идентификатор из docker ps -a, затем

docker exec -it container_id bash

и попробуйте двумя способами, описанными выше, я предлагаю сократить папку. После того, как вы закончите, перезапустите контейнер с docker restart container_id

...