Docker-compose устанавливает пользователя и группу на установленном томе

Я пытаюсь установить том в файле docker-compose для apache. Проблема в том, что apache в моем докере выполняется под www-data:www-data, но смонтированный каталог создается под root:root. Как я могу указать пользователя смонтированного каталога?

Я попытался запустить команду setupApacheRights.sh. chown -R www-data:www-data /var/www, но он говорит chown: changing ownership of '/var/www/somefile': Permission denied

services:
    httpd:
        image: apache-image
        ports:
            - "80:80"
        volumes:
            - "./:/var/www/app"
        links:
            - redis
        command: /setupApacheRights.sh

Я бы предпочел указать пользователя, под которым он будет установлен. Есть ли способ?

Ответ 1

Сначала определите идентификатор пользователя www-data:

$ docker exec DOCKER_CONTAINER_ID id
uid=100(www-data) gid=101(www-data) groups=101(www-data)

Затем на хосте докера измените владельца смонтированного каталога с помощью uid (в данном примере 100):

chown -R 100 ./

Динамическое расширение

Если вы используете docker-compose вы можете сделать это следующим образом:

$ docker-compose exec SERVICE_NAME id
uid=100(www-data) gid=101(www-data) groups=101(www-data)
$ chown -R 100 ./

Вы можете поместить это в одну строку:

$ chown -r $(docker-compose exec SERVICE_NAME id -u) ./

Флаг -u будет печатать только uid на стандартный вывод.

Ответ 2

Для достижения желаемого поведения без изменения владельца/разрешений в хост-системе выполните следующие действия.

  1. добавьте определение в ваш docker-compose.yml

    user: "${UID}:${GID}"
    

    так что ваш файл может выглядеть так

    php: # this is my service name
        user: "${UID}:${GID}" # we added this line to get a specific user / group id
        image: php:7.3-fpm-alpine # this is my image
    # and so on
    
  2. установите значения в вашем .env файле

    UID=1000
    GID=1001
    

Теперь ваш пользователь в контейнере имеет идентификатор 1000, а группа - 1001, и вы можете установить это по-разному для каждой среды.

Если вы не используете docker-compose или хотите узнать больше различных подходов для достижения этой цели, прочитайте мой источник информации: https://dev.to/acro5piano/specifying-user-and-group-in-docker- i2e

Ответ 3

Очевидно, что по состоянию на середину 2019 года нет настроек владельца/группы/разрешения для volume, но есть хороший обходной путь, который заключается в создании каталога с нужными настройками в вашем docker-compose. Когда docker-compose монтируется в этом месте, он сохраняет эти разрешения.

Dockerfile:

# setup folder before switching to user
RUN mkdir /volume_data
RUN chown postgres:postgres /volume_data
USER postgres

докер-compose.yml

volumes:
   - /home/me/postgres_data:/volume_data

источник