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

24

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

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

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

dflemstr
источник
Почему было бы неправильно связывать их где-нибудь еще?
Майкл Хэмптон
1
Потому что место хранения - это деталь реализации. В тот день, когда докер добавляет еще один драйвер хранилища, местоположение будет перемещено. Мне нужно сделать это полуавтоматическим, и по этой причине было бы неплохо использовать публичные API.
dflemstr
2
Возможно, стоит подумать о работе над nsenter (или docker-enter) для достижения ваших целей; Конечно, существует ограничение на наличие контрольного кода / инструментов внутри контейнера.
ВладФр
Нет ли способа указать Linux монтировать через границу контейнера?
dflemstr
@dflemstr да, есть, --volumes-from вроде как делает это, похоже, монтирует объединение каталога из базового образа другого контейнера и тома, но это поведение не задокументировано на
афике

Ответы:

10

Посмотрите на 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

обновление: вы должны ssh на ваш докер при запуске этого.

laktak
источник
2
Мои изображения довольно большие (много сотен мегабайт), поэтому загрузка отдельных файлов - это слишком много. Он будет каждый раз создавать файл размером в несколько сотен мегабайт.
dflemstr
@dflemstr используйте строку с tar x PATH-IN-CONTAINER, она будет извлекать только те файлы, которые вам нужны.
Лактак
... но весь tarархив все еще создается в демоне Docker, и для его создания требуется несколько минут ...
dflemstr
@dflemstr не уверен, какие у тебя настройки, но, например, docker export ubuntu|tar -t|grep etc/networkу меня 3 секунды.
Лактак
Вы, вероятно, запускаете его на той же машине, что и демон Docker, поэтому вам не нужно выполнять передачу по сети, а ubuntuизображение действительно маленькое ...
dflemstr
3

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

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

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

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

Эрик Китаир
источник
2

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

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

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

gmuslera
источник
1

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

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

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

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

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

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

mnieber
источник