Как запустить crond от имени пользователя без полномочий root в контейнере Docker? - PullRequest
0 голосов
/ 01 ноября 2018

Я использую ниже Dockerfile и entrypoint.sh. Мне нужно запустить службу crond в контейнере как пользователь без полномочий root, но я получаю Permission denied. Как запустить службу crond как пользователь без полномочий root?

Мне нужно иметь USER в Dockerfile, поскольку это обязательная настройка администратора в моей платформе Openshift 3.

Dockerfile

FROM centos:centos7.4.1708
RUN yum update -y && yum install -y cronie && rm -rf /var/lib/apt/lists/*
RUN cd / && mkdir /code
ADD entrypoint.sh /code/
RUN chmod -R 755 /code/entrypoint.sh
ENTRYPOINT ["/code/entrypoint.sh"]
RUN useradd -l -u 1001510000 -c "1001510000" 1001510000
USER 1001510000
CMD ["top"]

entrypoint.sh

#!/bin/bash
echo "in the entrypoint!"
echo "executing id"
id
echo "executing crond start"
crond start
echo "executing $@"
$@

Ошибка вывода

in the entrypoint!
executing id
uid=1001510000(1001510000) gid=1000(1001510000) groups=1000(1001510000)
executing crond start
crond: can't open or create /var/run/crond.pid: Permission denied
executing top

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Прежде всего crond должен вызывать команды от имени других пользователей. Как он мог это сделать, не управляя root? Даже если вы каким-то образом запустите этот демонический процесс с этим пользователем, существует высокая вероятность того, что ему не хватит других разрешений для запуска определенных команд.

Но я думаю, вы можете попробовать, может быть, это поможет:

Ваш пользователь просто не имеет прав, как говорится в журнале ошибок. Если вы хотите попробовать запустить как пользователь без полномочий root, создайте группу, скажем crond-users и измените группу /var/run/crond.pid с root на crond-users. И последнее, но не менее важное: добавьте своего пользователя в группу crond-users. Вот так:

RUN groupadd crond-users && \
    chgrp crond-users /var/run/crond.pid && \
    usermod -a -G crond-users 1001510000

Hitn 1

Кроме того, точка входа по умолчанию для докера /bin/bash -c, но не имеет команды по умолчанию. Итак, ваш Dockerfile может выглядеть так:

FROM centos:centos7.4.1708
RUN yum update -y && yum install -y cronie && rm -rf /var/lib/apt/lists/* && \
    cd / && mkdir /code && \
    chmod -R 755 /code/entrypoint.sh && \
    useradd -l -u 1001510000 -c "1001510000" 1001510000 && \
    addgroup crond-users && \
    chgrp crond-users /var/run/crond.pid && \
    usermod -a -G crond-users 1001510000

ADD entrypoint.sh /code/
USER 1001510000

CMD ["/code/entrypoint.sh", "top"]

Подсказка 2.

Старайтесь избегать многократного использования одной и той же инструкции Dockerfile (в вашем случае у вас было 4x RUN). Каждая инструкция представляет собой отдельный слой в последующем образе сборки. Это известно Лучшая практика Dockerfile .

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

В Docker 1.10 и выше создаются только инструкции RUN, COPY, ADD слои. Другие инструкции создают временные промежуточные изображения и не увеличивайте размер сборки напрямую.

0 голосов
/ 01 ноября 2018

Как насчет сборки в соответствии с Руководствами OpenShift для контейнерной платформы ? Таких как связанные uid и gid.

...