Смонтируйте содержание контейнера Докера в файловой системе хоста

Я хочу смочь осмотреть содержание контейнера Докера (только для чтения). Изящный способ сделать это состоял бы в том, чтобы смонтировать содержание контейнера в каталоге. Я говорю о монтировании содержания контейнера на хосте, не о монтировании папки на хосте в контейнере.

Я вижу, что существует два драйвера устройства хранения данных в Докере прямо сейчас: aufs и btrfs. Моя собственная установка Докера использует btrfs, и просматривающий к/var/lib/docker/btrfs/subvolumes показывает мне один каталог на контейнер Докера в системе. Это - однако деталь реализации Докера, и чувствует себя неправильным смонтироваться - связывают эти каталоги где-то в другом месте.

Существует ли надлежащий способ сделать это, или я должен исправить Докера для поддержки этих видов монтирования?

24
задан 18 August 2014 в 19:08
5 ответов

Вы можете использовать nsenter для запуска вашей программы проверки (которая, вероятно, уже должна быть включена в контейнер) внутри контейнера / пространства имен. Но чтобы смонтировать файловую систему контейнера, как показано внутри, вы должны смонтировать исходный образ и все слои, если это aufs, или эквивалентное действие для устройства сопоставления, btrfs и других (будущих) используемых механизмов хранения, разных в каждом случае. Вероятно, было бы более эффективно, если бы docker выполнял всю работу за вас, как и предполагалось, и использовал nsenter для проверки внутри контейнера.

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

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

2
ответ дан 28 November 2019 в 20:18

Взгляните на экспорт докеров .

Чтобы быстро вывести список файлов в вашем контейнере:

docker export CONTAINER|tar -t

Для экспорта:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Или для просмотра файла :

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 поддерживает cp :

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

обновление: вы должны использовать ssh на свой докер-компьютер при запуске этого.

10
ответ дан 28 November 2019 в 20:18

Вы можете использовать docker commit, чтобы сохранить текущее состояние вашего контейнера в новом изображении, и запустить интерактивный контейнер с этого изображения для просмотра содержимого.

Из документации :

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

Надеюсь, это поможет.

.
3
ответ дан 28 November 2019 в 20:18

РЕДАКТИРОВАТЬ: Я попробовал решение, приведенное ниже, и, к сожалению, на практике оно не сработало. Смонтированная файловая система неточно отражает файловую систему контейнера (даже с cache = no ). Я не уверен, является ли это фундаментальной проблемой или я делаю что-то не так.

Вы можете установить sshd в образ докера и использовать docker exec для запуска службы ssh ( / usr / sbin / sshd -D ) в контейнере докера (обратите внимание, что должен быть открыт 22 порт SSH контейнера докера).

Затем используйте docker cp , чтобы скопировать свой открытый ключ ssh в каталог /root/.ssh/authorized_keys контейнера докеров.

Наконец, используйте docker inspect , чтобы найти IP-адрес контейнера и смонтировать файловую систему контейнера с помощью

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  root@xxx.xx.x.x:/ /mnt/my_container

Вам нужно будет написать сценарий, чтобы эта работа комфортно работала на практике.

1
ответ дан 28 November 2019 в 20:18

Podman может работать с образами Docker. Вы можете использовать его для монтирования работающего или остановленного контейнера:

prompt:~ # mnt=`podman mount 26e8b85f7a5c`
prompt:~ # ls $mnt
bin  boot  dev  etc  home  lib  ...  tmp  usr  var

где 26e8b85f7a5c — идентификатор монтируемого контейнера.

2
ответ дан 26 June 2020 в 18:14

Теги

Похожие вопросы