Как корректно настроить права доступа в Docker?

Здравствуйте! Я занимаюсь настройкой Laravel в Docker и столкнулся с проблемой: после выполнения команды <br/> <br/> <pre><code>docker compose run composer create-project laravel/laravel .</code></pre> <br/> <br/> созданные папки и файлы Laravel в хосте (в папке src) имеют права владельца root. Не могли бы вы объяснить, как правильно решить эту проблему? <br/> <br/> <b>docker-compose.yml:</b> <br/> <pre><code class="yaml">services:
  nginx:
    image: nginx:stable-alpine
    ports:
      - 8000:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./src:/var/www/laravel
    depends_on:
      - mysql
      - php

  php:
    build:
      context: dockerfiles
      dockerfile: php.Dockerfile
    volumes:
      - ./src:/var/www/laravel

  mysql:
    image: mysql:8.0
    ports:
      - 3316:3306
    env_file:
      - env/mysql.env

  composer:
    build:
      context: dockerfiles
      dockerfile: composer.Dockerfile
    volumes:
      - ./src:/var/www/laravel</code></pre> <br/> <br/> <b>composer.Dockerfile:</b> <br/> <pre><code>FROM composer:latest

WORKDIR /var/www/laravel

ENTRYPOINT ["composer", "--ignore-platform-reqs"]</code></pre> <br/> <br/> <b>php.Dockerfile:</b> <br/> <pre><code>FROM php:8.2-fpm-alpine

WORKDIR /var/www/laravel

RUN docker-php-ext-install pdo pdo_mysql</code></pre>
  • 19 сентября 2024 г. 9:13
Ответы на вопрос 2
Для корректной настройки прав доступа к файлам и папкам в Docker, особенно в случае с Laravel, рекомендуется следовать этим шагам:

### 1. Использование UID и GID

При запуске контейнеров с Docker, процессы внутри контейнеров могут выполняться с правами пользователя `root`, если вы явно не установите другого пользователя. Это может приводить к созданию файлов с владельцем `root`, что вызывает проблемы при взаимодействии с этими файлами после выхода из контейнера. Один из способов решения этой проблемы — это установка UID и GID пользователя, который будет использоваться в контейнерах.

#### Измените `composer.Dockerfile` и `php.Dockerfile`

Добавьте создание пользователя и группы, которые будут совпадать с UID и GID пользователя на хост-системе. Например:

```dockerfile
# composer.Dockerfile
FROM composer:latest

# Замените на нужный UID и GID
ARG USER_ID=1000
ARG GROUP_ID=1000

RUN addgroup -g $GROUP_ID appuser && \
    adduser -u $USER_ID -G appuser -D appuser

USER appuser
WORKDIR /var/www/laravel

ENTRYPOINT ["composer", "--ignore-platform-reqs"]
```

```dockerfile
# php.Dockerfile
FROM php:8.2-fpm-alpine

# Замените на нужный UID и GID
ARG USER_ID=1000
ARG GROUP_ID=1000

RUN addgroup -g $GROUP_ID appuser && \
    adduser -u $USER_ID -G appuser -D appuser

USER appuser
WORKDIR /var/www/laravel

RUN docker-php-ext-install pdo pdo_mysql
```

### 2. Передать UID и GID при построении образа

В вашем `docker-compose.yml` добавьте `args` для передачи UID и GID при сборке образов:

```yaml
services:
  php:
    build:
      context: dockerfiles
      dockerfile: php.Dockerfile
      args:
        USER_ID: ${UID}
        GROUP_ID: ${GID}
    volumes:
      - ./src:/var/www/laravel

  composer:
    build:
      context: dockerfiles
      dockerfile: composer.Dockerfile
      args:
        USER_ID: ${UID}
        GROUP_ID: ${GID}
    volumes:
      - ./src:/var/www/laravel
```

### 3. Установка переменных среды

Чтобы передать текущий UID и GID, добавьте их в файл `.env` или в командной строке перед запуском Docker:

```bash
export UID=$(id -u)
export GID=$(id -g)
```

### 4. Запуск команды для создания проекта

После внесения изменений, попробуйте снова запустить команду для создания проекта:

```bash
docker-compose run --rm composer create-project laravel/laravel .
```

### 5. Убедитесь, что файлы имеют корректные права

Теперь создаваемые файлы должны принадлежать пользователю, идентификатор которого соответствует UID на вашей хост-машине. Вы можете проверить это с помощью команды:

```bash
ls -l ./src
```

Теперь файлы и папки должны иметь правильные права доступа, и вы сможете работать с ними в Laravel без проблем.
Укажите запуск команды композера от имени текущего пользователя на хосте: 
docker compose run --user $(id -u):$(id -g) composer create-project laravel/laravel .


Вы также можете задать пользователя по умолчанию в composer.Dockerfile:
FROM composer:latest

WORKDIR /var/www/laravel

RUN adduser -D -u USER www-data
USER www-data

ENTRYPOINT ["composer", "--ignore-platform-reqs"]
Похожие вопросы