
У меня проблема с установкой 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 непосредственно из реестра).