Назад | Перейти на главную страницу

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

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

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

Есть ли правильный способ сделать это или мне нужно пропатчить Docker для поддержки таких типов монтирования?

Взгляни на docker export.

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

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

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

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

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

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

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

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

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

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

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

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

Затем используйте 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

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

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

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

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