Извлечение из существующего Dockerfile + установка USER на не-root - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь найти общие рекомендации о том, как:

  1. Взять произвольный (родительский) Dockerfile, например, один из официальных образов Docker, которые запускают свою контейнерную службу от имени root,
  2. Извлечь из него пользовательский (дочерний) Dockerfile (через FROM ...),
  3. Настройте child так, чтобы он выполнял ту же службу, что и parent , но не пользователь root.

Я искал и пытался уже несколько дней, но не смог найти подходящего решения.

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

FROM mariadb:10.3

RUN chgrp -R 0 /var/lib/mysql && \
    chmod g=u /var/lib/mysql

USER 1234

Однако проблема, с которой я сталкиваюсь снова и снова,всякий раз, когда parent Dockerfile объявляет некоторый путь как VOLUME (в приведенном выше примере фактически VOLUME /var/lib/mysql), это фактически делает невозможным для child Dockerfile настроить права доступа к файлам для этого конкретногодорожка. chgrp & chmod в этом случае не имеют никакого эффекта, поэтому получившийся в результате докер-контейнер не сможет успешно запуститься из-за проблем с правами доступа к файлу.

Я понимаю , что *Директива 1032 * работает таким образом: , а также , почему это так , но мне кажется, что она полностью препятствует простому решению данной проблемы: взять Dockerfile и настроить его простым, чистый и минималистичный способ запуска от имени пользователя root, а не root.

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

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

Неудовлетворительные подходы, которые я 'До сих пор мы обнаружили:

  • Скопируйте родительский Dockerfile и настройте его так, как нужно (эффективно дублируя код)
  • sed / awkчерез все файлы конфигурации службы во время сборки, чтобы заменить исходный путь VOLUME альтернативным путем, чтобы chgrp и chmod могли работать (оставив исходный путь VOLUME потерянным).

Мне действительно не нравятся эти подходы, так как они действительно требуют углубления в логику и инфраструктуру родительского Dockerfile и того, как работает сама служба.

Так что должно бытьлучшие способы сделать это, верно? Что мне не хватает? Помощь очень ценится.

1 Ответ

1 голос
/ 14 октября 2019

Разрешения для точек монтирования тома вообще не имеют значения, монтирование скрывает все базовые разрешения, с которых можно было начать. Кроме того, вы можете установить такие вещи на уровне Kubernetes, а не беспокоиться о Dockerfile вообще. Обычно это хотя PodSecurityPolicy, но вы также можете установить его в SecurityContext на самом модуле.

...