Почему cap_net_bind_service не работает в этом nginx вложенном Docker контейнере? - PullRequest
0 голосов
/ 20 марта 2020

Входной контроллер nginx для Kubernetes использует возможность cap_net_bind_service, которая является атрибутом файловой системы Linux, для получения разрешений на открытие привилегированного порта (порт 80). Однако у меня есть своего рода тест, который создает локальный кластер Kubernetes с использованием контейнеров docker в качестве виртуальных узлов (docker внутри docker) и запускает модуль входного контроллера nginx. Этот модуль контроллера работает нормально в Docker Desktop на Windows 10, но когда я запускаю тот же тест на Linux, модуль контроллера неоднократно вылетает при запуске с:

[17:27:34]nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

Все же требуется существует возможность во вложенном контейнере Docker:

$ allpods=$(kubectl get pods)
$ ingresspod=$(echo "$allpods"|grep '^nginx-ingress-controller'|head -n1)
$ kubectl exec "${ingresspod%% *}" -- getcap -v /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx = cap_net_bind_service+ep

SE Linux включен, но в разрешающем режиме на хосте Linux.

1 Ответ

1 голос
/ 23 марта 2020

Это оказалось потому, что на хосте Linux dockerd запускался с опцией --no-new-privileges.

...