Docker php-fpm работает как www-data - PullRequest
2 голосов
/ 10 апреля 2019

Недавно я учился создавать образы и контейнеры с помощью Docker. Я был довольно уверен в этом при использовании Mac, но недавно перешел на Ubuntu, я довольно новичок в этой части разработки.

В качестве «кода» я использую новый стандартный проект Laravel, и в настоящее время я использую только php-контейнер и nginx-контейнер.

Я использую файл docker-compose.yml для создания своих контейнеров:

version: "3.1"

services:
    nginx:
        image: nginx:latest
        volumes:
            - ./code:/var/www
            - ./nginx_conf.conf:/etc/nginx/conf.d/default.conf
        ports:
            - "80:80"
    php:
        image: php:7.3-fpm
        ports:
            - 9000
        volumes:
            - ./code:/var/www

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

Проблема:

  • php-fpm настроен с --with-fpm-user=www-data и --with-fpm-group=www-data, и это установлено в php:7.3-fpm Dockerfile (см. Здесь) .

  • Файлы на моем хост-компьютере сохраняются с моим именем пользователя и группой как владелец / группа.

  • Когда я захожу в контейнер, файлы принадлежат 1000 и группе 1000 (я предполагаю сопоставление моей учетной записи пользователя и группы на хост-компьютере?)

Однако, когда я получаю доступ к приложению через браузер, я получаю сообщение об ошибке отказа в разрешении при запуске (когда Laravel пытается создать файл журнала ошибок в хранилище). Я думаю, это потому, что php-fpm работает как www-data, но каталог хранения имеет разрешения drwxr-xr-x для владельца / группы. Phil: phil - мой владелец и группа хоста.

После нескольких часов поисков в Google и испытаний я попробовал следующее:

  • Рекурсивно измените владельца и группу каталога кодов на хост-компьютере на www-data:www-data. Это позволяет приложению Laravel работать, но теперь я не могу создавать или редактировать файлы etc на хосте, используя PHPStorm, потому что каталог доступен только для чтения (я полагаю, потому что phpstorm работает как мой пользователь, а каталог принадлежит другому пользователю / группа).

  • Я добавил свою учетную запись пользователя хоста в группу www-data и предоставил ей write разрешения, используя sudo chmod -R g+w ./code, что теперь позволяет приложению запускать приложение и писать phpstorm , выполняйте и т. д. файлы, но когда я создаю или редактирую файл, владелец файлов и группа меняются обратно на мой хост phil:phil, и я предполагаю, что это снова сломает приложение.

  • Я попытался создать образ php и настроить env (как описано в ссылке выше) для настройки на --with-fpm-user=phil --with-fpm-group=phil, но после сборки он ничего не меняет - он все еще работает с www-data (после прочтения проблемы с github я думаю, что это потому, что envs не может быть изменен до позднего времени, в какой момент php уже настроен?) (см. здесь проблему github)

У меня заканчиваются идеи, чтобы попробовать. Единственное, о чем я могу думать, это рекурсивно установить владельца и группу каталога кода на моем хосте на www-data и попробовать вместо этого запустить phpstorm как www-data, но это странно (Обновление: я пытался открыть phpstorm как Пользователь www-data, использующий sudo -u www-data phpstorm.sh, но я получаю исключение java - что-то связанное с графикой - так что этот подход также невозможен)

Теперь единственное, что я могу придумать, - это создать новое изображение php из базового образа alpine и полностью обойти изображения php - что кажется огромным неудобством только потому, что сопровождающие хотят использовать ENV вместо ARG

Я не уверен в лучшей практике для этого сценария. Должен ли я пытаться изменить способ запуска php-fpm (пользователь / группа)? я должен обновлять владельца / группу каталогов на моем хосте? я должен запускать phpstorm от имени другого пользователя?

Буквально любой совет будет с благодарностью.

1 Ответ

2 голосов
/ 10 апреля 2019

столкнулся с той же проблемой несколько недель назад.

на самом деле происходит то, что ваш хост и ваш контейнер совместно используют одни и те же файлы через том, поэтому они также имеют общие разрешения.

на производстве, все в порядке - ваш сервер (пользователь www-data) должен быть владельцем файлов, поэтому здесь нет проблем.В процессе разработки все усложняется - когда вы пытаетесь получить доступ к этим файлам с хоста.

Я знаю несколько обходных путей, но самым хакерским является установка www-data uid в контейнере на 1000, поэтомуон будет соответствовать вашему uid на хосте.

Еще один простой способ - открыть 777 полных разрешений для общего каталога, поскольку это необходимо только в сборке разработки - (хотя никогда не следует делать это в производственной среде, но, как яКак уже упоминалось ранее, в производственной среде у вас нет никаких проблем, поэтому вы должны разделить 2 процесса и сделать это только в режиме разработки)

для меня наиболее элегантным решением, по-видимому, является предоставление всем членам группы доступа кфайлы (установите права доступа 770) и добавьте www-данные в вашу группу:

usermod www-data -a -G phill #// add it to your group

chown -r phill ./code #// make yourself the owner. might need sudo.

chmod 770 ./code #//grunt permissions to all group members
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...