Как правильно реализовать доступ к папкам проекта на Laravel в docker и на хост машине?

Структура проекта:

Сруктура проекта

Файл docker-compose:

version: '3'
services:
php_laravel:
image: devilbox/php-fpm:8.2-work
container_name: php_laravel
volumes:
  - ./www:/var/www/default/htdocs/
ports:
  - 9000
restart: always

nginx_laravel:
image: devilbox/nginx-stable:latest
container_name: nginx_laravel
links:
  - php_laravel
environment:
  - PHP_FPM_ENABLE=1~
  - PHP_FPM_SERVER_ADDR=php_laravel
volumes:
  - ./www:/var/www/default/htdocs/
  - ./conf/localhost.conf:/etc/httpd/conf.d/localhost.conf
  - ./log:/var/log/nginx-stable/
ports:
  - 82:80
restart: always

В папке WWW лежит проект на Laravel с папками app,public,storage.. и т.д., как правильно реализовать права на папки на хост мшине и если нужно в контейнерах, т.к. пользуюсь artisan из контейнера php_laravel,проблемы начинаются когда создаю контроллеры и т.п. из контейнера через артисан,phpstorm говорит что у него нет прав на редактирование данного файла, так же возникают проблемы с папкой storage/framework,и папкой bootstrap/cache, спасибо


Ответы (3 шт):

Автор решения: abu

Если docker-compose.yaml используется только локально, добавьте в секцию с приложением user: "1000:1000". 1000 обычно UID пользователя от которого происходит вход по умолчанию. В некоторых случаях он может быть другой

Либо, можно заходить в контейнер из-под юзера, который является владельцем файлов в контейнере docker compose exec -u <user> <container> <shell>. Имя юзера можно увидеть, сделав ls -la в каталоге с проектом в контейнере

Первый способ предпочтительнее, поскольку не портит владельца файлов на хостовой машине

→ Ссылка
Автор решения: DiD

Добавьте в docker-compose также ftp-сервер.

Например, docker-pure-ftpd.

Просто прописываем корневую папку со скриптами. Добавляем логин и пароль пользователя для соединения. Не забудьте пробросить 21 порт.

Файлы будут доступны для редактирования в любом текстовом редакторе, как и в любом клиенте протокола FTP. Laravel работает с файлами по FTP также хорошо, как с локальными.

→ Ссылка
Автор решения: Alexandr Ogorodnik
  1. Настройка разрешений на хост-машине: Установите правильные разрешения и владельцев: Убедитесь, что папки вашего проекта Laravel имеют правильные разрешения и владельцев. Обычно это означает, что владелец должен быть вашим пользователем, а группа должна быть www-data.

    bash sudo chown -R $USER:www-data www sudo find www -type f -exec chmod 664 {} ; sudo find www -type d -exec chmod 775 {} ; sudo chown -R www-data:www-data www/storage sudo chown -R www-data:www-data www/bootstrap/cache

Дайте группе www-data доступ к созданию файлов и директорий:

bash
sudo chmod -R ug+rwx www/storage
sudo chmod -R ug+rwx www/bootstrap/cache
  1. Настройка Docker контейнеров: Запуск контейнеров от имени пользователя www-data: Убедитесь, что контейнеры Docker запускаются с правильными правами. В вашем docker-compose.yml файле, добавьте пользователя для сервиса php_laravel:

    yaml version: '3' services: php_laravel: image: devilbox/php-fpm:8.2-work container_name: php_laravel user: '1000:33' # замените '1000' на ваш user ID, а '33' на group ID www-data volumes: - ./www:/var/www/default/htdocs/ ports: - 9000 restart: always

    nginx_laravel: image: devilbox/nginx-stable:latest container_name: nginx_laravel links: - php_laravel environment: - PHP_FPM_ENABLE=1~ - PHP_FPM_SERVER_ADDR=php_laravel volumes: - ./www:/var/www/default/htdocs/ - ./conf/localhost.conf:/etc/httpd/conf.d/localhost.conf - ./log:/var/log/nginx-stable/ ports: - 82:80 restart: always

Убедитесь, что службы перезапускаются и применяются новые конфигурации:

bash
docker-compose down
docker-compose up -d
  1. Работа с Artisan и PHPStorm: Использование Artisan из контейнера: Убедитесь, что вы выполняете команды artisan от имени пользователя www-data:

    bash docker exec -u www-data php_laravel php /var/www/default/htdocs/artisan make:controller ExampleController

Настройка PHPStorm: Убедитесь, что PHPStorm имеет правильные настройки для работы с файлами. В настройках проекта, проверьте права на запись для папок.

→ Ссылка