У меня возникла проблема с разрешениями в Docker Compose на смонтированном томе, из-за которой я не могу назначить правильные разрешения от хоста контейнеру. Смонтированный каталог всегда приводит к получению разрешений root:root внутри контейнера, несмотря на несколько попыток обеспечить правильное владение. Ниже приведены полные сведения о моей конфигурации и предпринятых попытках.
Контекст:
- Я работаю в Ubuntu.
- У меня есть проект Laravel, контейнеризованный с помощью Docker Compose, который включает в себя несколько контейнеров: php, nginx, композитор, node.
- Мне нужно смонтировать каталог с именем project, который находится на хосте, внутри контейнера php в /var/www/main/project. .
- Я пытаюсь убедиться, что смонтированный том имеет того же пользователя () и группу (
Код: Выделить всё
user@zg.local), как и на хосте.Код: Выделить всё
domain users@zg.local - Основная проблема заключается в том, что каждый раз при монтировании тома возникают права root:root внутри контейнера, что приводит к ошибки, когда Laravel пытается выполнить запись в этот каталог.
Код: Выделить всё
docker-compose.yamlКод: Выделить всё
docker-compose.yaml
services:
php:
build:
context: ./dockerfiles/php
dockerfile: Dockerfile
args:
USER_ID: ${USER_ID}
GROUP_ID: ${GROUP_ID}
user: "${USER_ID}:${GROUP_ID}"
privileged: true
command: |
bash -c "
mkdir -p /var/www/html/storage/logs &&
mkdir -p /var/www/html/storage/framework/{sessions,views,cache} &&
mkdir -p /var/www/html/storage/app/public &&
chown -R ${USER_ID}:${GROUP_ID} /var/www/main/project &&
chmod -R 775 /var/www/html/storage &&
php-fpm
"
volumes:
- ./src:/var/www/html
- laravel_storage:/var/www/html/storage
- laravel_cache:/var/www/html/bootstrap/cache
- ../vb-crs:/var/www/main/project:rw,shared
networks:
- laravel_net
environment:
TMPDIR: /var/www/html/tmp
PHP_IDE_CONFIG: "serverName=Docker"
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
laravel_storage:
driver: local
laravel_cache:
driver: local
networks:
laravel_net:
driver: bridge
Код: Выделить всё
dockerfiles/php/DockerfileКод: Выделить всё
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y \
libxml2-dev \
&& docker-php-ext-install dom pdo pdo_mysql
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
COPY ./xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Crea il gruppo e l'utente con i tuoi ID
ARG USER_ID
ARG GROUP_ID
# Usa nomi semplici per il sistema ma mantieni gli ID corretti
RUN groupadd -g ${GROUP_ID} appgroup && \
useradd -u ${USER_ID} -g ${GROUP_ID} -m appuser
# Crea tutte le directory necessarie per Laravel
RUN mkdir -p /var/www/html/storage/framework/sessions \
&& mkdir -p /var/www/html/storage/framework/views \
&& mkdir -p /var/www/html/storage/framework/cache \
&& mkdir -p /var/www/html/storage/logs \
&& mkdir -p /var/www/html/storage/app/public \
&& mkdir -p /var/www/html/bootstrap/cache \
&& chown -R appuser:appgroup /var/www/html \
&& chmod -R 775 /var/www/html
# Configura PHP-FPM
RUN sed -i "s/user = www-data/user = appuser/g" /usr/local/etc/php-fpm.d/www.conf && \
sed -i "s/group = www-data/group = appgroup/g" /usr/local/etc/php-fpm.d/www.conf
USER appuser
WORKDIR /var/www/html
Несмотря на различные попытки, когда я вхожу в контейнер с помощью docker-compose exec php bash и проверяю разрешения с помощью ls -la /var/www/main/project, я всегда вижу root:root как владельца смонтированного каталога. Это приводит к ошибке, когда Laravel пытается создать файлы или каталоги по этому пути.
Пример ошибки:
Код: Выделить всё
Failed to create router structure: file_put_contents(/var/www/main/project/home/web/[redacted]/router/chain/[redacted]/test.php): Failed to open stream: No such file or directory
- Запустите контейнер с теми же UID и GID, что и у хоста. :
- Я использовал файл .env для передачи значений USER_ID и GROUP_ID.< /li>
Добавлен пользователь: "${USER_ID}:${GROUP_ID}" в docker-compose.yaml. - Передан USER_ID и GROUP_ID как создайте аргументы в файле Dockerfile, чтобы создать пользователя с этими идентификаторами.
- Результат: разрешения тома проекта по-прежнему остаются root:root.
- Я использовал файл .env для передачи значений USER_ID и GROUP_ID.< /li>
- Использовать флаг привилегий:
- Я добавил привилегированный: true в контейнер PHP, чтобы гарантировать, что контейнер имеет root-доступ и может изменять разрешения подключенного тома.
- Результат: без изменений. Разрешения остаются root:root.
- Команда при запуске контейнера[/b]:
Код: Выделить всё
chown- В команде запуска (), я добавил chown -R ${USER_ID}:${GROUP_ID} /var/www/main/project, чтобы изменить разрешения смонтированного тома сразу после запуска контейнера.
Код: Выделить всё
command - Результат: снова права root:root.
- В команде запуска (
- Распространение монтирования ()[/b]:
Код: Выделить всё
:shared- Я попробовал добавить :rw,shared к смонтированному тому, чтобы гарантировать распространение изменений разрешений. между хостом и контейнером.
- Результат: разрешения не изменились.
- Дополнительные проверки:
- Я запустил ls -la как на хосте, так и внутри контейнера, подтвердив, что каталог на хосте имеет правильный адресusers@zg.local:domainusers@zg .local пользователь и группа.
Как убедиться, что смонтированный том ../project имеет правильные права пользователя и группы внутри контейнера Docker? Есть ли что-то, чего мне не хватает в текущей конфигурации? Или есть другой подход, который я мог бы попробовать решить эту проблему с разрешениями?
Заранее благодарим вас за любые предложения!
Подробнее здесь: https://stackoverflow.com/questions/791 ... ltiple-con