Как проверить структуру каталогов архива Docker? - PullRequest
0 голосов
/ 23 октября 2018

Дело в том, что некоторые пользователи используют docker save для получения архивов изображений и отправляют их мне.Я хотел бы знать структуру каталогов этого архива.Например, если в образе есть каталоги / var, / root и / home / somefiles?Если я не использую docker load xxx.tar и docker run, как проверить структуру каталогов архива docker tar?Потому что мне нужно добавить несколько файлов по указанному пути в изображении.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Формат docker save / docker load - , слегка документированный ;Я сталкивался с очень немногими инструментами, которые фактически манипулируют им в любой форме.

Если вы просто хотите добавить что-то к содержимому изображения, тогда лучше всего docker load сделать это, а затем использовать Dockerfile какnormal

FROM image:from-the-tar-file
COPY a_file.txt /

В противном случае файл tar содержит каталог на слой в изображении, и каждый из этих каталогов содержит файл layer.tar с фактическим содержимым слоя.Вам нужно написать свой собственный инструмент для проверки этого, но вы можете использовать что-то вроде библиотеки tar-файлов Python , чтобы заглянуть внутрь файла, не раскрывая его полностью.

Вот быстрый скрипт на Pythonэто проверяет, содержит ли какой-либо слой в tar-файле docker save оболочку:

#!/usr/bin/env python3

import sys
import tarfile

def main():
    with tarfile.open(sys.argv[1]) as outer:
        layers_tars = [n for n in outer.getnames() if n.endswith('/layer.tar')]
        for layer_tar in layers_tars:
            layer_file = outer.extractfile(layer_tar)
            if layer_file is None:
                continue
            with tarfile.open(fileobj=layer_file) as layer:
                if 'bin/sh' in layer.getnames():
                    print(layer_tar)

if __name__ == '__main__':
    main()

Изменение и повторная сборка файла сохранения довольно сложны;Я никогда не делал это успешно.Есть несколько файлов JSON, которые не имеют четко определенного формата в документации, и не на 100% ясно, что происходит, когда слои не полностью аддитивны (слой удаляет файл, который был на нижнем уровне).

0 голосов
/ 23 октября 2018

Это действительно зависит от драйвера хранилища Docker.Для последнего рекомендованного overlay2 это можно сделать следующим образом:

Например, у меня есть работающий контейнер Ubuntu:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2bfe549061f0        ubuntu              "/bin/bash"         6 seconds ago       Up 5 seconds                            keen_lewin

Далее вы можете проверить свой контейнер на предмет поиска его данных:

$ docker inspect 2bfe549061f0
...
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/39d10569b3d2543b9517c008e2244e1abde19aa3ec482ba0854cbdd332441e28-init/diff:/var/lib/docker/overlay2/32515dae6c1711b05d726b1cd4856f7df3a24a5beb36b412eec7713e1965ce7a/diff:/var/lib/docker/overlay2/b74326fdacfa1e713b567d286e76077f12f357d92a7c5418a850db5b78fb9d2b/diff:/var/lib/docker/overlay2/b14f98b9aefba75ba8d36005833eb4a9ec9aea84358756e753f7cd480d2c7c1a/diff:/var/lib/docker/overlay2/c3432c55caac2d52d2715624bece08daa309e8df0ba5207399b369d09bd6b360/diff:/var/lib/docker/overlay2/b81022c8b19d25f3bd88329ddade8dab337809fc90429c691df5e314bc773320/diff",
                "MergedDir": "/var/lib/docker/overlay2/39d10569b3d2543b9517c008e2244e1abde19aa3ec482ba0854cbdd332441e28/merged",
                "UpperDir": "/var/lib/docker/overlay2/39d10569b3d2543b9517c008e2244e1abde19aa3ec482ba0854cbdd332441e28/diff",
                "WorkDir": "/var/lib/docker/overlay2/39d10569b3d2543b9517c008e2244e1abde19aa3ec482ba0854cbdd332441e28/work"
...

Короче говоря: «чистое» изображение будет сохранено по последнему пути в ключе LowerDir.В моем случае это путь:

$ sudo ls -l /var/lib/docker/overlay2/b81022c8b19d25f3bd88329ddade8dab337809fc90429c691df5e314bc773320/diff 
    total 76
    drwxr-xr-x  2 root root 4096 мая 26 06:45 bin
    drwxr-xr-x  2 root root 4096 апр 24 14:34 boot
    drwxr-xr-x  4 root root 4096 мая 26 06:44 dev
    drwxr-xr-x 29 root root 4096 мая 26 06:45 etc
    drwxr-xr-x  2 root root 4096 апр 24 14:34 home
    drwxr-xr-x  8 root root 4096 мая 26 06:44 lib
    drwxr-xr-x  2 root root 4096 мая 26 06:44 lib64
    drwxr-xr-x  2 root root 4096 мая 26 06:44 media
    drwxr-xr-x  2 root root 4096 мая 26 06:44 mnt
    drwxr-xr-x  2 root root 4096 мая 26 06:44 opt
    drwxr-xr-x  2 root root 4096 апр 24 14:34 proc
    drwx------  2 root root 4096 мая 26 06:45 root
    drwxr-xr-x  4 root root 4096 мая 26 06:44 run
    drwxr-xr-x  2 root root 4096 мая 26 06:45 sbin
    drwxr-xr-x  2 root root 4096 мая 26 06:44 srv
    drwxr-xr-x  2 root root 4096 апр 24 14:34 sys
    drwxrwxrwt  2 root root 4096 мая 26 06:45 tmp
    drwxr-xr-x 10 root root 4096 мая 26 06:44 usr
    drwxr-xr-x 11 root root 4096 мая 26 06:45 var

# Enusre it is Ubuntu 18.04
$ sudo cat /var/lib/docker/overlay2/b81022c8b19d25f3bd88329ddade8dab337809fc90429c691df5e314bc773320/diff/etc/os-release
NAME="Ubuntu"
VERSION="18.04 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Если я создаю что-то внутри контейнера, например,

root@2bfe549061f0:/# echo 123 > check_file.txt

Изменения могут быть найдены в UpperDir:

$ sudo ls -l /var/lib/docker/overlay2/39d10569b3d2543b9517c008e2244e1abde19aa3ec482ba0854cbdd332441e28/diff
total 4
-rw-r--r-- 1 root root 4 окт 23 15:25 check_file.txt

$ sudo cat /var/lib/docker/overlay2/39d10569b3d2543b9517c008e2244e1abde19aa3ec482ba0854cbdd332441e28/diff/check_file.txt
123

Подобные вещи могут быть выполнены без каких-либо работающих контейнеров через

docker image inspect <IMAGE>

Дополнительная информация:

https://docs.docker.com/storage/storagedriver/overlayfs-driver/#image-and-container-layers-on-disk

0 голосов
/ 23 октября 2018

По сути, архив изображений Docker содержит все слои, которые также являются tar файлом.Я не думаю, что вы можете легко проверить файл tar с помощью инструментов tar: вам сначала нужно распаковать архив Docker, а затем tar -tf все слои.

Возможно, мы могли бы использовать skopeo, который может"скопировать" архив докера в каталог:

skopeo copy docker-archive://image.tgz dir:///tmp/image
...