Я хочу запустить consul в kubernetes, но мне не разрешено запускать его от имени пользователя root.
Поэтому я добавил
RUN addgroup consul root
в Dockerfile (производный от FROM consul:1.0.3
)
и начать развертывание в кубернетах с
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
xyz.service: consul-deployment
name: consul-deployment
spec:
template:
spec:
securityContext:
runAsUser: 100
Теперь я ожидаю, что kubernetes запустит консул с пользователем 100
(который раньше был пользователем consul
, когда я запускал его локально в Docker, а теперь должен быть членом группы root
).
Но теперь я получаю следующее сообщение об ошибке при запуске модуля
chown: /consul/data: Operation not permitted
chown
выполняется в Consuls docker-entrypoint.sh
, и я предполагаю, что он (все еще) не работает, потому что пользователь 100
не является пользователем root.
Может ли кто-нибудь объяснить мне, как запустить контейнер с пользователем без полномочий root, когда в контейнере есть сценарий точки входа, ожидающий выполнения от имени пользователя root?
Я закончил исправление Consuls docker-entrypoint.sh
, чтобы проверить, является ли пользователь root, перед выполнением команды chown, добавив несколько тестов if [ "$(id -u)" = "0" ]
.
Вы можете найти патч на GitHub.
Фактически, было бы лучше создать свой собственный контейнер, унаследованный от Consul, с применением исправления в реальном времени благодаря sed. Я пробовал RUN /bin/sed -i 's/^\(.*set -- su-exec consul:consul "$@"\)/ if [ "$(id -u)" = "0" ]; then\n \1\n fi/' /usr/local/bin/docker-entrypoint.sh
, которые работают хорошо!
Если / consul является монтированием nfs, возможно, на сервере установлены root_squash
и all_squash
. Это приведет к сбою операций chown, потому что новые файлы / папки автоматически будут переданы никому / nogroup.
Если вы можете изменить общий ресурс (временно) на использование no_root_squash
и no_all_squash
, пока все файлы не будут настроены, все будет в порядке. Поскольку эта файловая система обычно сохраняется, это должно быть необходимо только один раз, поэтому после этого вы можете снова сбросить ее на root_squash
и all_squash
.
На случай, если кто-то ищет решение. Вы также можете использовать изображение Консула от Bitnami. Они предоставляют некорневые образы популярных приложений.
docker pull bitnami/consul:1.4.4
Строго говоря, это не ответ на ваш вопрос, но вы можете добиться некоторого успеха, запустив их точку входа в режиме
-x
, чтобы увидеть, какие два значения на самом деле вызывают сбой этот тест;command: ["/usr/bin/dumb-init", "/bin/sh", "-x", "/usr/local/bin/docker-entrypoint.sh"]
в вашем PodSpec теоретически должен это делать. Кстати, просто членство в группеroot
абсолютно ничего не делает для способности к вещамchown
.