Я хочу иметь возможность проверять содержимое контейнера 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
- это идентификатор монтируемого контейнера.