Подтвердить что ты не робот

Как перечислить объемы, установленные на докере из контейнера

Хотите перечислить все каталоги контейнеров, которые являются смонтированными томами.

то есть. чтобы получить такую ​​же информацию, которую я получаю от

docker inspect --format "{{ .Volumes }}" <self>

Но изнутри контейнера и без установки docker там.

Я попробовал cat /proc/mounts, но не могу найти для него подходящий фильтр.

4b9b3361

Ответ 1

Если ваш хост-докер является OSX, то смонтированные тома будут меняться osxfs (или fuse.osxfs). Вы можете запустить

mount | grep osxfs | awk '{print $3}'

и получить список всех установленных томов.

Если ваш хост-докер - это Linux (по крайней мере, Ubuntu 14+, а может и другие), то все тома будут включены /dev, но не на устройстве, которое находится в вашей файловой системе container/dev. Объемы будут рядом с /etc/resolv.conf,/etc/hostname и/etc/hosts. Если вы запустите mount | grep ^/dev, а затем отфильтруйте любой из файлов в ls /dev/*, затем отфильтруйте три файла, перечисленные выше, вы должны остаться с томами хоста.

mount | grep ^/dev/ | grep -v /etc | awk '{print $3}'

Я предполагаю, что специфика может варьироваться от Linux до Linux. Не идеально, но, по крайней мере, можно выяснить.

Ответ 2

Как вы можете прочитать из многих комментариев, которые у вас были, контейнер изначально представляет собой ограниченную зарезервированную часть ресурсов, которая полностью отключена от остальной части вашего компьютера. Он не знает, что является докером, и внутри контейнера все ведет себя так, как будто это отдельная машина. Похоже на матрицу, я думаю;) Вы получаете доступ к ядру главной машины и ее ресурсам, но все же снова ограничены только как отфильтрованный набор. Это делается с помощью замечательной функциональности "cgroups", которая поставляется с ядрами Unix/Linux.

Теперь хорошие новости: есть несколько способов предоставить информацию вашему докеру, но это то, что вам нужно будет предоставить и построить самостоятельно.

Самый простой способ - монтировать unix-сокет, расположенный на вашем хосте в /var/run/docker.sock, внутри вашего контейнера в том же месте. Таким образом, когда вы используете клиент-докер в своем контейнере, вы напрямую разговариваете с механизмом докеров на своем хосте. Однако с большой силой приходит большая ответственность. Это хорошая настройка, но она не очень безопасна. Как только кому-то удастся попасть в ваш докер, он имеет корневой доступ к вашей хост-системе таким образом.

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

(Вы понимаете, что есть параметр для установки, чтобы дать монтированию псевдоним внутри вашего докера?)

Ответ 3

Возможно, команда docker exec - это то, что вы ищете.

Это позволит вам запускать произвольные команды внутри существующего контейнера.

Например:

docker exec -it <mycontainer> bash

Конечно, любая команда, которую вы запускаете, должна существовать в файловой системе контейнера.

#docker  cp  >>>> Copy files/folders between a container and the local filesystem
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

скопировать полную папку:

docker cp ./src/build b081dbbb679b:/usr/share/nginx/html

Примечание. Это скопирует каталог сборки в контейнерах... /nginx/html/directory для копирования только файлов, находящихся в папке:

docker cp ./src/build/ b081dbbb679b:/usr/share/nginx/html

Примечание. Это скопирует содержимое каталога сборки в контейнеры …./nginx/html/ directory

Параметры хранения Docker:

Объемы хранятся в части файловой системы хоста, которой управляет Docker (/var/lib/docker/тома/в Linux). Процессы Non-Docker не должны изменять эту часть файловой системы. Объемы - лучший способ сохранить данные в Docker.

При создании тома он сохраняется в каталоге на хосте Docker. Когда вы монтируете том в контейнер, этот каталог монтируется в контейнер. Это похоже на способ привязки монтирования, за исключением того, что тома управляются Docker и изолированы от основных функций хост-машины.

Данный том можно монтировать одновременно в несколько контейнеров. Если ни один из запущенных контейнеров не использует том, этот том по-прежнему доступен для Docker и не удаляется автоматически. Вы можете удалить неиспользуемые тома, используя обрезку тома докеры.

Когда вы монтируете том, его можно назвать или анонимным. Анонимным томам не дается явное имя, когда они сначала монтируются в контейнер, поэтому Docker дает им случайное имя, которое гарантировано будет уникальным в пределах данного узла Docker. Помимо имени, имена и анонимные тома ведут себя одинаково.

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

Связывающие крепления могут храниться в любом месте на главной системе. Они могут даже быть важными системными файлами или каталогами. Процессы без докеров на хосте Docker или контейнере Docker могут изменять их в любое время. Доступен с первых дней Докера. Удерживающие устройства имеют ограниченную функциональность по сравнению с томами. Когда вы используете привязку монтирования, файл или каталог на главной машине монтируется в контейнер. На файл или каталог ссылается его полный путь на главной машине. Файл или каталог уже не должен существовать на хосте Docker. Он создается по требованию, если он еще не существует. Bind mounts очень эффективны, но они полагаются на файловую систему хост-машин, имеющую определенную структуру каталогов. Если вы разрабатываете новые приложения Docker, подумайте об использовании именованных томов. Вы не можете использовать команды Docker CLI для непосредственного управления привязками привязок.

Один из побочных эффектов использования привязок - лучше или хуже - это то, что вы можете изменить файловую систему хоста через процессы, запущенные в контейнере, включая создание, изменение или удаление важных системных файлов или каталогов. Это мощная способность, которая может иметь последствия для безопасности, включая воздействие на процессы, не связанные с Докером, на хост-системе.

Подставки

tmpfs хранятся только в памяти хост-систем и никогда не записываются в файловую систему хост-систем.

Монтирование tmpfs не сохраняется на диске либо на хосте Docker, либо внутри контейнера. Он может использоваться контейнером в течение всего срока службы контейнера, чтобы хранить непостоянное состояние или конфиденциальную информацию. Например, внутренние службы роуминга используют монтирования tmpfs для монтирования секретов в контейнеры служб.

Если вам нужно указать параметры драйвера тома, вы должны использовать --mount.   -v или --volume: Состоит из трех полей, разделенных символами двоеточия (:). Поля должны быть в правильном порядке, и значение каждого поля не сразу становится очевидным. o В случае именованных томов первое поле является именем тома и уникально на данном хост-компьютере. Для анонимных томов первое поле опущено. o Второе поле - это путь, в котором файл или каталог будет установлен в контейнере. o Третье поле является необязательным и представляет собой список опций, разделенных запятыми, например ro. Эти параметры обсуждаются ниже. • --mount: Состоит из нескольких пар ключ-значение, разделенных запятыми и каждый из которых состоит из кортежа =. Синтаксис -mount является более подробным, чем -v или -volume, но порядок ключей незначителен, а значение флага легче понять. o Тип монтирования, который может быть связан, томом или tmpfs. В этом разделе обсуждаются тома, поэтому тип всегда будет томом. o Источник крепления. Для названных томов это имя тома. Для анонимных томов это поле опущено. Может указываться как источник или src. o Конечный пункт принимает в качестве значения путь, в котором файл или каталог будет установлен в контейнере. Может указываться как цель, dst или цель. o Опция readonly, если она присутствует, заставляет монтировку привязки монтироваться в контейнер как доступную только для чтения. o Опция volume-opt, которая может быть указана более одного раза, принимает пару ключ-значение, состоящую из имени опции и ее значения.