Когда я пытаюсь запустить 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? Буду очень признателен за любую помощь
Я думаю, что вы можете решить эту проблему, добавив 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
или выйдите из системы, чтобы активировать изменения в группах.
Я публикую это как ответ, а не как комментарий, поскольку это действительно решает проблему. Однако у меня есть сомнения относительно решения, поэтому я надеюсь, что здесь будут другие ответы. Я изменил sudoers, добавив
www-data hostname = (ALL) NOPASSWD: ALL
По умолчанию! Requiretty
который предлагает полное решение проблемы — теперь я могу запустить контейнер Docker из сценария PHP. Все очень хорошо, но у меня есть некоторые опасения по поводу ослабления sudoers таким образом. Среда, в которой все это происходит, контролируется, но, тем не менее, это звучит как далеко не идеальное решение.
Я попытался заменить NOPASSWD: ALL на NOPASSWD: / path / to / script, но это не работает, так как ожидается, что NOPASSWD: приложение.
Если бы кто-нибудь мог предложить способ, который предлагает более безопасное решение, я был бы очень признателен.