Когда я пытаюсь запустить контейнер 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 через shell_exec, поэтому исполняющий пользователь на Ubuntu 14.04 является www-данными. Для хорошей меры я попытался запустить команду docker как sudo, но это не имело значения. Googling вокруг для "Вы пытаетесь...", появляется несколько ссылок, которые могут иметь некоторую информацию, которая имеет значение, например, здесь, но я еще не смог ее полностью понять.
Также для хорошей меры я выводю docker comamnd, который я пытаюсь выполнить для 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? Я был бы очень благодарен за любую помощь
Я отправляю это как ответ, а не как комментарий, поскольку он действительно разрешает проблему. Однако у меня есть оговорки в отношении решения, поэтому я надеюсь, что здесь будут другие ответы. Я модифицировал sudoers, добавив
www-data hostname = (ВСЕ) NOPASSWD: ВСЕ по умолчанию! requiretty
который предлагает полное разрешение проблемы - теперь я могу запустить контейнер Docker из PHP-скрипта. Allv очень хорошо, но у меня есть некоторые опасения по поводу ослабления шудеров таким образом. Окружающая среда, в которой все это происходит, контролируется, но, тем не менее, она звучит как далеко не идеальное решение.
Я попытался заменить NOPASSWD: ALL на NOPASSWD: /path/to/script, но это не работает, так как ожидается, что NOPASSWD: application.
Если бы кто-нибудь мог предложить способ, который предлагает более безопасное решение, я был бы самым обязанным.
Я думаю, вы можете решить это, добавив пользователя www-data
в группу docker
.
От https://docs.docker.com/installation/ubuntulinux/#giving-non-root-access:
Предоставление доступа без полномочий root
Демон docker всегда работает как пользователь root, а с версии Docker версии 0.5.2 демон docker привязывается к сокету Unix вместо TCP-порта. По умолчанию этот сокет Unix принадлежит пользователю root, и поэтому по умолчанию вы можете получить доступ к нему с помощью sudo.
Начиная с версии 0.5.3, если вы (или ваш установщик Docker) создаете группу Unix, называемую докере, и добавьте к ней пользователей, тогда демон docker сделает доступ к сокету Unix для чтения/записи группой докеров при запуске демона, Демон-докер должен всегда запускаться как пользователь root, но если вы запустите клиент докеров в качестве пользователя в группе докеров, вам не нужно добавлять sudo ко всем клиентским командам. Начиная с версии 0.9.0 вы можете указать, что группа, отличная от докера, должна иметь сокет Unix с опцией -G.
Пример:
Добавьте группу докеров, если она еще не существует.
sudo groupadd docker
Добавьте подключенного пользователя "$ {USER}" в группу докеров. Измените имя пользователя в соответствии с вашим предпочтительным пользователем.
sudo gpasswd -a ${USER} docker
Перезапустите демон Docker:
sudo service docker restart
Если вы используете Ubuntu 14.04 и вместо этого используйте docker.io
:
sudo service docker.io restart
Либо newgrp docker
либо войдите в систему, чтобы активировать изменения в группах.