Изменение прав доступа к файлам в смонтированной папке внутри контейнера docker


В настоящее время я пытаюсь настроить PHPMyAdmin в контейнере на windows, но я не могу изменить разрешения файла config.inc.php.

Я нашел: не могу вызвать chown внутри контейнера Docker (Docker для Windows) и подумал, что это может быть несколько связано, но это, кажется, применимо только к MongoDB.

Это мой докер-сочинитель.yml

    version: "3"

    services:
      pma:
        image: (secrect company registry)/phpmyadmin
        ports: 
          - 9090:80
        volumes:
          - /c/Users/tom/projects/myproject/data/var/www/public/config.inc.php:/var/www/public/config.inc.php

Теперь, когда я docker exec -it [container] bash и изменение в смонтированном каталоге, я пытаюсь запустить chmod на config.inc.php, но по какой-то причине это не удается молча .

root@22a4bag43245: ls -la config.inc.php
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php
root@22a4bag43245: chmod 655 config.inc.php
root@22a4bag43245: ls -la config.inc.php
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php

Учитывая связанный ответ, я подумал, что могу просто переместить том из моего дома пользователя, но тогда vbox вообще не монтирует папку.

Как я могу постоянно изменять права доступа к файлам /var/www/public/config.inc.php?

Редактировать:

Я использую docker-machine который запускает экземпляр boot2docker внутри виртуальной машины Virtualbox с общей папкой на /c / Users, из которой можно монтировать Тома в контейнеры. Разрешения указанных томов это те, о ком идет речь. Виртуальные машины хранятся в папке /c / Users / tom/.докер /

Я решил использовать рабочий процесс Virtualbox над Hyper-V, потому что мне нужен VBox в моем ежедневном рабочем процессе, и запуск Hyper-V и Virtualbox вместе в одной системе невозможен из-за несовместимости между различными гипервизорами.
2 3

2 ответа:

У меня была та же проблема: я не мог сменить владельца даже после использования chown. И как я исследовал , это было связано с тем, что Тома NTFS монтировались внутри файловой системы ext. Поэтому я применил другой подход.

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

sudo ln $(docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>) <absolute_path_of_destination>

Таким образом, вы можете иметь свои файлы в желаемое место, внутри docker и без каких-либо проблем с разрешением, и вы сможете изменить содержимое файла, как в обычном монтировании Тома за счет жесткой символической ссылки.

Здесь является рабочей реализацией этого процесса, который монтирует и связывает каталог. Если вы хотите узнать подробности, смотрите раздел possible fix в выпуске .

EDIT

Шаги по реализации этого подхода:

  1. монтировать соответствующий файл во внутренний docker-том (Также известный как named volumes).
  2. Прежде чем сделать hardlink, убедитесь, что Тома и соответствующий файл присутствуют там. Чтобы гарантировать это, вы должны были запустить контейнер по крайней мере один раз до этого, или если вы хотите автоматизировать создание этого файла, вы можете включить запуск docker, который создает необходимые файлы и завершает работу.

    docker run --rm -itd \ -v "<Project_name>_<volume_name>:/absolute/path" \ <image> bash -c "touch /absolute/path/<my_file>"

Это настройки создают объемы и необходимые файлы. Здесь container - это имя моего проекта, по умолчанию это имя папка, в которой присутствует проект и <volume_name>, такая же, как та, которую мы хотим использовать в нашем исходном контейнере. <image> может быть тем же самым, который уже используется в ваших оригинальных контейнерах.

  1. создайте в ОС жесткую ссылку на фактическое расположение файла в системе. Вы можете найти расположение файла, используя docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>/<my_file>. Пользователи Linux могут использовать ln в терминале, а пользователи windows могут использовать mklink в командной строке.

В шаге 3 мы не использовали /absolute/path, так как <volume_name> ссылается к этому месту уже есть доступ, и нам просто нужно обратиться к файлу.

Попробуйте выполнить одно из следующих действий:

  1. Если вы можете восстановить изображение image: image: (secrect company registry)/docker-stretchimal-apache2-php7-pma, то внутри файла docker добавьте следующее

    USER root RUN chmod 655 config.inc.php

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

  1. Попробуйте exec, используя корень пользователя явным образом

    docker exec -it -u root [container] bash