shell — Запуск Docker-контейнеров из переполнения стека

Когда я пытаюсь запустить Docker-контейнер через PHP, я получаю следующую ошибку

level="fatal" msg="Get http:///var/run/docker.sock/v1.16/containers/json?limit=1: dial unix
/var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon
without TLS?"

Я пытаюсь выполнить команду docker run через shell_exec, поэтому исполняющим пользователем в Ubuntu 14.04 является www-data. Для хорошей меры я попытался выполнить команду docker как sudo, но это не имело никакого значения. Поиск в поиске «Вы пытаетесь…» приводит к появлению нескольких ссылок, которые могут содержать некоторую информацию, которая имеет отношение к делу — например, Вот — но я пока не смог понять этого.

Кроме того, для удобства я выводю команду docker, которую я пытаюсь выполнить, в stderr, копирую ее и выполняю напрямую через SSH. Вот эта команда

docker run -h user118 -d -p 8406:443 -v /var/docks/user118/logs:/var/log/apache2 -v
/var/docks/user118/mysql:/var/lib/mysql -v /var/docks/user118/redis:/var/lib/redis -v
/var/docks/user118/secure:/var/secure -v /var/docks/user118/site:/var/www/html lamp

с последующим

docker ps -a

и затем просмотр этого контейнера — без проблем, все работает отлично.

Мне известно, что команда будет вызывать комментарии в духе «у вас должно быть только одно приложение на контейнер». Это не проблема здесь.

Я пытаюсь сделать невозможное здесь или есть относительно простой способ манипулировать докером через скрипт PHP и shell_exec? Буду очень признателен за любую помощь

0

Решение

Я думаю, что вы можете решить эту проблему, добавив www-data пользователь к docker группа.

От https://docs.docker.com/installation/ubuntulinux/#giving-non-root-access:

Предоставление некорневого доступа

Демон docker всегда запускается от имени пользователя root, и, начиная с версии Docker 0.5.2, демон docker связывается с сокетом Unix, а не с портом TCP. По умолчанию этот сокет Unix принадлежит пользователю root, и по умолчанию вы можете получить к нему доступ с помощью sudo.

Начиная с версии 0.5.3, если вы (или ваш установщик Docker) создаете группу Unix с именем docker и добавляете в нее пользователей, то демон docker сделает владение сокетом Unix доступным для чтения / записи для группы docker при запуске демона , Демон docker всегда должен запускаться как пользователь root, но если вы запускаете клиент docker как пользователь в группе docker, вам не нужно добавлять sudo ко всем командам клиента. Начиная с версии 0.9.0, вы можете указать, что группа, отличная от docker, должна иметь сокет Unix с опцией -G.

Пример:

  • Добавьте группу докеров, если она еще не существует.

    sudo groupadd docker
    
  • Добавьте подключенного пользователя «$ {USER}» в группу Docker. Измените имя пользователя в соответствии с вашим предпочтительным пользователем.

    sudo gpasswd -a ${USER} docker
    
  • Перезапустите демон Docker:

    sudo service docker restart
    
  • Если вы используете Ubuntu 14.04 и выше docker.io вместо:

    sudo service docker.io restart
    
  • Либо сделать newgrp docker или выйдите из системы, чтобы активировать изменения в группах.

3

Другие решения

Я публикую это как ответ, а не как комментарий, поскольку это действительно решает проблему. Однако у меня есть сомнения относительно решения, поэтому я надеюсь, что здесь будут другие ответы. Я изменил sudoers, добавив

www-data hostname = (ALL) NOPASSWD: ALL
По умолчанию! Requiretty

который предлагает полное решение проблемы — теперь я могу запустить контейнер Docker из сценария PHP. Все очень хорошо, но у меня есть некоторые опасения по поводу ослабления sudoers таким образом. Среда, в которой все это происходит, контролируется, но, тем не менее, это звучит как далеко не идеальное решение.

Я попытался заменить NOPASSWD: ALL на NOPASSWD: / path / to / script, но это не работает, так как ожидается, что NOPASSWD: приложение.

Если бы кто-нибудь мог предложить способ, который предлагает более безопасное решение, я был бы очень признателен.

-1

По вопросам рекламы [email protected]