Мой вопрос связан с этим вопросом о копировании файлов из контейнеров на хосты; У меня есть Dockerfile, который извлекает зависимости, компилирует артефакт сборки из источника и запускает исполняемый файл. Я также хочу скопировать артефакт сборки (в моем случае он .zip
создается sbt dist
в '../ target / `, но я думаю, что этот вопрос также относится к банкам, двоичным файлам и т. Д.
docker cp
работает с контейнерами, а не с изображениями; мне нужно запускать контейнер только для того, чтобы получить из него файл? В сценарии я пробовал работать /bin/bash
в интерактивном режиме в фоновом режиме, копируя файл, а затем убивая контейнер, но это кажется глупым. Есть ли способ лучше?
С другой стороны, я бы хотел избежать распаковки .tar
файла после запуска docker save $IMAGENAME
только для того, чтобы получить один файл (но сейчас это кажется самым простым, хотя и самым медленным вариантом).
Я бы использовал тома докеров, например:
docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out
но я работаю boot2docker
в OSX, и я не знаю, как напрямую писать в мою файловую систему хоста Mac (тома для чтения и записи монтируются внутри моей виртуальной машины boot2docker, что означает, что я не могу легко поделиться сценарием для извлечения blah.zip
из образа с др. мысли?
источник
create
добавлена / удалена команда (ее нет в 1.01)docker create
был представлен в docker 1.3, blog.docker.com/2014/10/…docker cp $id:path > local-tar-file
работал отлично.К сожалению, похоже, что нет способа копировать файлы непосредственно из образов Docker. Сначала вам нужно создать контейнер, а затем скопировать файл из контейнера.
Однако, если ваше изображение содержит
cat
команду (а она будет работать во многих случаях), вы можете сделать это с помощью одной команды:Если ваше изображение не содержит
cat
, просто создайте контейнер и используйтеdocker cp
команду, предложенную в ответе Игоря.источник
Гораздо более быстрый вариант - скопировать файл из запущенного контейнера на смонтированный том:
** VS **
источник
cat a >b
vscp a b
такие же тайминги, как показано здесь. Кроме того, если исходный путь и конечный путь находятся в разных файловых системах, то оба примера приведут к полной побайтовой копии.В комментариях родителей уже было показано, как использовать cat . Вы также можете использовать tar аналогичным образом:
источник
docker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
хотел предоставить однострочное решение, основанное на чистой функциональности докеров (bash не нужен)
изменить: контейнер даже не нужно запускать в этом решении
источник
Другой (краткий) ответ на эту проблему:
Обновление - как отметил @Elytscha Smith, это работает только в том случае, если ваше изображение имеет встроенный bash
источник
Я использую boot2docker на MacOS. Могу вас заверить, что скрипты на базе "docker cp" переносимы. Потому что любая команда передается внутри boot2docker, но затем двоичный поток ретранслируется обратно клиенту командной строки docker, запущенному на вашем Mac. Таким образом, операции записи из докер-клиента выполняются внутри сервера и записываются обратно в исполняющий экземпляр клиента!
Я делюсь сценарием резервного копирования для томов докеров с любым контейнером докеров, который я предоставляю, и мои сценарии резервного копирования протестированы как на Linux, так и на MacOS с помощью boot2docker. Резервными копиями можно легко обмениваться между платформами. В основном я выполняю следующую команду внутри своего скрипта:
Я уже перемещал архивы между контейнером linux и контейнером Mac без каких-либо изменений в сценарии резервного копирования или восстановления. Если это то, что вы хотите, вы можете найти здесь весь сценарий и руководство: blacklabelops / jenkins
источник
Вы можете привязать локальный путь на хосте к пути в контейнере, а затем
cp
желаемый файл (ы) к этому пути в конце вашего скрипта.Тогда копировать потом не нужно.
источник