Я пытаюсь найти общие рекомендации о том, как:
- Взять произвольный (родительский) Dockerfile, например, один из официальных образов Docker, которые запускают свою контейнерную службу от имени root,
- Извлечь из него пользовательский (дочерний) Dockerfile (через
FROM ...
), - Настройте 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 и того, как работает сама служба.
Так что должно бытьлучшие способы сделать это, верно? Что мне не хватает? Помощь очень ценится.