Я хотел бы извлечь файл из образа Docker без необходимости запуска образа.
Эта docker saveопция в настоящее время не является жизнеспособной для меня, поскольку она сохраняет слишком большой файл только для того, чтобы распаковать конкретный файл.
Я хотел бы извлечь файл из образа Docker без необходимости запуска образа.
Эта docker saveопция в настоящее время не является жизнеспособной для меня, поскольку она сохраняет слишком большой файл только для того, чтобы распаковать конкретный файл.
Ответы:
Вы можете извлечь файлы из изображения с помощью следующих команд:
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
Согласно docker create документации , контейнер не запускается:
Команда
docker createсоздает доступный для записи слой-контейнер над указанным изображением и подготавливает его для выполнения указанной команды. Идентификатор контейнера затем печатается вSTDOUT. Это похоже на то,docker run -dчто контейнер никогда не запускается. Затем вы можете использоватьdocker start <container_id>команду для запуска контейнера в любой точке.
Для справки (мой предыдущий ответ), менее эффективный способ извлечения файла из изображения следующий:
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Ничто из вышеперечисленного не помогло мне. Полная рабочая команда:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
Без кавычек catпередается без имени файла, поэтому он не знает, что показать. Также рекомендуется удалить контейнер после завершения команды.
Если я не ошибаюсь, я считаю, что Docker-контейнеры хранят кэшированные файлы, созданные в следующей директории для Ubuntu:
/var/lib/docker/aufs/diff/<container_id>
Оттуда вы сможете получить доступ к файловой системе и получить ваши файлы.
layersizeи json, и также не читается пользователем (даже если пользователь находится в группе Docker). /var/lib/docker/aufs/diffбудет содержать файл, который я ищу (но классифицируется не по идентификатору контейнера) и также не читается.
/var/lib/docker/aufs(но не ко всем другим каталогам /var/lib/docker/)
Если сохранение полного вывода docker saveне является вариантом, вы можете использовать конвейеры, чтобы извлечь из него только необходимый файл.
К сожалению, поскольку вывод представляет собой «tar of tars», это может быть слегка итеративный процесс.
Когда мне нужно было извлечь файл, я сделал следующее:
1) Определите, какую версию изображения интересующий вас файл изменил в последнее время (как вы это делаете, вероятно, зависит от вашего изображения), а также дату, когда он был создан / сохранен
2) Получить полное оглавление из вывода docker saveкоманды с помощью:
docker save IMAGE_NAME | tar -tvf -
3) Уточните layer.tarфайл (ы) в выходных данных этой команды, которые соответствуют дате изображения, которое вы определили на шаге 1. (Вы можете добавить, | grep layer.tarчтобы просто показать эти файлы)
4) Извлеките этот layer.tarфайл в стандартный формат и получите его содержание:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) Убедитесь, что нужный файл указан в списке, и извлеките его, как только найдете имя:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
Если существует несколько layer.tarфайлов, соответствующих дате, которую вы ищете на шаге 2/3, вам может потребоваться повторить шаг 4 для каждого из них, пока вы не найдете правильный
Замените текст заглавными буквами в приведенных выше командах на правильные имена изображений, контрольные суммы и имена файлов для вашего случая.