TL;DR

TL;DR

У меня проблема с установкой docker. По некоторым причинам безопасности я настроил свой "daemon.json", чтобы пространство имен переключалось на другого пользователя ( userns-remap). Теперь у меня проблема в том, что если я запускаю контейнер (с переключенным контекстом пользователя ( USER containeruser) и пытаюсь пинговать другой, который находится в той же сети контейнера, я получаю следующую ошибку:

$ ping 172.16.0.3
PING 172.16.0.3 (172.16.0.3): 56 data bytes
ping: permission denied (are you root?)

Я уже пробовал несколько вещей с AppArmor, назначая больше возможностей и т. д. Но ничего не помогло решить эту проблему.

Рабочий образ — это Alpine Linux без каких-либо модификаций.

Есть ли у вас решение моей проблемы?

решение1

TL;DR

apk add iputils

Объяснение

Alpine основан наbusyboxкоторый реализует обычные команды linux в одном бинарнике. Если вы посмотрите на каталог /binна вашем базовом образе alpine, вы увидите, что pingкоманда (как и другие) является символической ссылкой на/bin/busybox

Для запуска от имени обычного пользователя pingтребуетсяsuid битset. Вы можете поддаться искушению установить бит suid на символической ссылке (т.е. chmod u+s /bin/ping). Но это фактически установит его на двоичном файле busybox, а значит, и на всех других командах, зарегистрированных как символическая ссылка, что будет нарушением безопасности.

К счастью, в alpine есть iputilsпакет, содержащий альтернативную версию ping. Если вы установите его, он заменит символическую ссылку на простой двоичный файл, содержащий необходимые разрешения для выполнения всеми. Просто добавьте указанную выше необходимую команду в RUNстроку в вашем Dockerfile.

решение2

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

Вы можете выполнить следующую команду, чтобы войти в оболочку как пользователь root контейнера Docker.

docker exec -u 0 -it <container-name> <shell>

В зависимости от оболочки, присутствующей на изображении, shellэто может быть любой из zsh, bash, sh, ash, и т. д. Вы можете найти его методом проб и ошибок.

Это особенно полезно, если у вас нет файла dockerfile для его изменения (например, при извлечении образа docker непосредственно из реестра).

Связанный контент