Я хочу смочь осмотреть содержание контейнера Докера (только для чтения). Изящный способ сделать это состоял бы в том, чтобы смонтировать содержание контейнера в каталоге. Я говорю о монтировании содержания контейнера на хосте, не о монтировании папки на хосте в контейнере.
Я вижу, что существует два драйвера устройства хранения данных в Докере прямо сейчас: aufs и btrfs. Моя собственная установка Докера использует btrfs, и просматривающий к/var/lib/docker/btrfs/subvolumes показывает мне один каталог на контейнер Докера в системе. Это - однако деталь реализации Докера, и чувствует себя неправильным смонтироваться - связывают эти каталоги где-то в другом месте.
Существует ли надлежащий способ сделать это, или я должен исправить Докера для поддержки этих видов монтирования?
Вы можете использовать nsenter для запуска вашей программы проверки (которая, вероятно, уже должна быть включена в контейнер) внутри контейнера / пространства имен. Но чтобы смонтировать файловую систему контейнера, как показано внутри, вы должны смонтировать исходный образ и все слои, если это aufs, или эквивалентное действие для устройства сопоставления, btrfs и других (будущих) используемых механизмов хранения, разных в каждом случае. Вероятно, было бы более эффективно, если бы docker выполнял всю работу за вас, как и предполагалось, и использовал nsenter для проверки внутри контейнера.
Есть и другие подходы. docker diff покажет, какие файлы были изменены в этом контейнере, если вы хотите увидеть, что изменилось вместо того, что было в исходном изображении.
А для данных, которые должны быть постоянными и доступными для проверки, вероятно, лучшим шаблоном было бы иметь их в томе в контейнере и монтировать либо в реальной файловой системе, либо в чистом контейнере данных, либо в том же контейнер, но вы можете запустить другой контейнер с программой проверки, монтирующей из него эти тома.
Взгляните на экспорт докеров
.
Чтобы быстро вывести список файлов в вашем контейнере:
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 на свой докер-компьютер при запуске этого.
Вы можете использовать docker commit, чтобы сохранить текущее состояние вашего контейнера в новом изображении, и запустить интерактивный контейнер с этого изображения для просмотра содержимого.
Из документации :
Может быть полезно записать изменения или настройки файла контейнера в новый образ. Это позволяет отлаживать контейнер, запуская команду интерактивная оболочка, или для экспорта рабочего набора данных на другой сервер.
Надеюсь, это поможет.
. РЕДАКТИРОВАТЬ: Я попробовал решение, приведенное ниже, и, к сожалению, на практике оно не сработало. Смонтированная файловая система неточно отражает файловую систему контейнера (даже с 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
Вам нужно будет написать сценарий, чтобы эта работа комфортно работала на практике.
Podman может работать с образами Docker. Вы можете использовать его для монтирования работающего или остановленного контейнера:
prompt:~ # mnt=`podman mount 26e8b85f7a5c`
prompt:~ # ls $mnt
bin boot dev etc home lib ... tmp usr var
где 26e8b85f7a5c
— идентификатор монтируемого контейнера.