Я думаю об использовании Docker для построения моих зависимостей на сервере Continuous Integration (CI), чтобы мне не пришлось устанавливать все среды выполнения и библиотеки на самих агентах.
Для этого мне нужно скопировать артефакты сборки, которые встроены в контейнер, обратно в хост. Это возможно?
docker
docker-container
file-copying
user2668128
источник
источник
Ответы:
Чтобы скопировать файл из контейнера на хост, вы можете использовать команду
Вот пример:
Здесь goofy_roentgen - это имя контейнера, которое я получил от следующей команды:
Вы также можете использовать (часть) ID контейнера . Следующая команда эквивалентна первой
источник
docker ps -alq
.docker cp ...
docker cp -L
было скопировать символические ссылкиВам не нужно использовать
docker run
.Вы можете сделать это с
docker create
.Из документов :
Итак, вы можете сделать:
Здесь вы никогда не запускаете контейнер. Это выглядело выгодно для меня.
источник
-ti
обязательным иbash
требуется?Смонтируйте «том» и скопируйте туда артефакты:
Затем, когда сборка заканчивается, и контейнер больше не работает, он уже скопировал артефакты из сборки в
artifacts
каталог на хосте.редактировать
Предостережение: при этом вы можете столкнуться с проблемами с идентификатором пользователя докера, совпадающим с идентификатором текущего запущенного пользователя. То есть файлы в
/artifacts
будут показаны как принадлежащие пользователю с UID пользователя, использованного внутри контейнера докера. Обходным путем может быть использование UID вызывающего пользователя:источник
chown
команду для сопоставления идентификатора пользователя и идентификатора группы на хост-компьютере.Смонтируйте том, скопируйте артефакты, настройте идентификатор владельца и идентификатор группы:
источник
TLDR;
Описание
docker run
с томом хоста,chown
артефактом,cp
артефактом для тома хоста:Этот трюк работает, потому что
chown
вызов внутри heredoc принимает$(id -u):$(id -g)
значения извне работающего контейнера; т.е. хост докера.Преимущества:
docker container run --name
илиdocker container create --name
раньшеdocker container rm
послеисточник
cp
и ответы на основе объема. Кроме того, дляid
трюка за владение, это иногда настоящая головная больБольшинство ответов не указывают на то, что контейнер должен работать до того
docker cp
, как сработает:источник
Windows Hyper-V
это, по- видимому необходимо , чтобы остановить контейнер перед копированием файла .Если у вас нет работающего контейнера, только изображение, и если вы хотите скопировать только текстовый файл, вы можете сделать что-то вроде этого:
источник
Я публикую это для всех, кто использует Docker для Mac. Вот что сработало для меня:
Обратите внимание, что при монтировании с использованием
-v
этогоbackup
каталога автоматически создается.Надеюсь, это кому-нибудь пригодится. :)
источник
volumes
команду в корень config.yml, чтобы тома были доступны для нескольких контейнеров.Если вы просто хотите извлечь файл из изображения (вместо работающего контейнера), вы можете сделать это:
docker run --rm <image> cat <source> > <local_dest>
Это вызовет контейнер, запишет новый файл, затем удалит контейнер. Однако один недостаток заключается в том, что права доступа к файлу и дата изменения не будут сохранены.
источник
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
источник
С выпуском Docker 19.03 вы можете пропустить создание контейнера и даже создание образа. Существует вариант с сборками на основе BuildKit для изменения выходного назначения. Вы можете использовать это для записи результатов сборки в локальный каталог, а не в изображение. Например, вот сборка go-файла:
Из приведенного выше Dockerfile я создаю
artifact
этап, который включает только файлы, которые я хочу экспортировать. И недавно введенный--output
флаг позволяет мне записывать их в локальный каталог вместо изображения. Это необходимо выполнить с помощью движка BuildKit, который поставляется с 19.03:После завершения сборки
app
бинарный файл был экспортирован:У Docker есть другие опции для
--output
флага, задокументированные в их репозитории BuildKit: https://github.com/moby/buildkit#outputисточник
В качестве более общего решения есть плагин CloudBees, который Jenkins может встроить в контейнер Docker . Вы можете выбрать изображение для использования из реестра Docker или определить Dockerfile для сборки и использования.
Он будет монтировать рабочее пространство в контейнер как том (с соответствующим пользователем), устанавливать его в качестве рабочего каталога, выполнять любые команды, которые вы запрашиваете (внутри контейнера). Вы также можете использовать плагин docker-workflow (если вы предпочитаете код над пользовательским интерфейсом) для этого с помощью команды image.inside () {}.
В основном все это запекается на вашем CI / CD-сервере, а затем и на некоторых.
источник
Я использовал PowerShell (Admin) с этой командой.
пример
источник
Другой хороший вариант - сначала собрать контейнер, а затем запустить его, используя флаг -c с интерпретатором оболочки для выполнения некоторых запятых.
Приведенная выше команда делает это:
-я = запустить контейнер в интерактивном режиме
--rm = удалил контейнер после выполнения.
-v = общая папка как том от пути вашего хоста до пути контейнера.
Наконец, / bin / sh -c позволяет вам ввести команду в качестве параметра, и эта команда скопирует ваши файлы домашней работы в путь контейнера.
Я надеюсь, что этот дополнительный ответ может помочь вам
источник
Создайте каталог данных в хост-системе (вне контейнера) и подключите его к каталогу, видимому изнутри контейнера. Это размещает файлы в известном месте в хост-системе и упрощает доступ инструментов к инструментам и приложениям в хост-системе.
источник
Создайте путь, куда вы хотите скопировать файл, а затем используйте:
источник
Вы можете использовать
bind
вместо,volume
если вы хотите смонтировать только одну папку, а не создавать специальное хранилище для контейнера:Создайте свое изображение с тегом:
docker build . -t <image>
Запустите ваше изображение и привяжите текущий каталог $ (pwd), где хранится app.py, и сопоставьте его с / root / example / внутри вашего контейнера.
docker run --mount type=bind,source="$(pwd)",target=/root/example/ <image> python app.py
источник
Это также может быть сделано в SDK, например, Python. Если у вас уже есть встроенный контейнер, вы можете найти имя через консоль (
docker ps -a
), имя, кажется, представляет собой некоторую конкатенацию ученого и прилагательного (то есть «relaxed_pasteur»).Проверьте
help(container.get_archive)
:Тогда что-то вроде этого вытащит из указанного пути (/ output) в контейнере на ваш хост-компьютер и распакует tar.
источник