Я пытаюсь создать решение для резервного копирования и восстановления контейнеров Docker, с которыми мы работаем.
У меня есть базовый образ Docker, который я создал, ubuntu:base
и я не хочу пересобирать его каждый раз с помощью файла Docker, чтобы добавлять в него файлы.
Я хочу создать скрипт, который запускается с хост-машины и создает новый контейнер с использованием ubuntu:base
образа Docker, а затем копирует файлы в этот контейнер.
Как я могу скопировать файлы с хоста в контейнер?
docker
docker-container
user3001829
источник
источник
Ответы:
cp
Команда может быть использована для копирования файлов.Один конкретный файл может быть скопирован в контейнер, например:
Один конкретный файл может быть скопирован из контейнера, например:
Для акцента,
mycontainer
является контейнер ID, не изображение ID.Несколько файлов, содержащихся в папке,
src
могут быть скопированы вtarget
папку с помощью:Справка: докерская документация по CLI для
cp
В версиях Docker до 1.8 было возможно только копировать файлы из контейнера на хост. Не от хоста до контейнера.
источник
COPY
предпочтительнее,ADD
когда это применимо.docker cp
для копирования из контейнера на хост работает хорошо, но когда он используется для копирования файлов с хоста на контейнер, ничего не происходит ... кто-нибудь знает почему? версия докера: версия докера 1.10.3, сборка cb079f6-не поддерживаетсяПолучить имя контейнера или короткий идентификатор контейнера:
Получить полный идентификатор контейнера:
Копировать файл:
ПРИМЕР:
или
источник
aufs
ноdevicemapper
. Самый простой способ проверить путь установки контейнеров (пока он работает) - запустить командуmount
./var/lib/docker/aufs/diff/<id>/
/var/lib
для меня.find / -name docker
тоже не помогло.Самый простой способ - смонтировать каталог хоста на контейнере при запуске контейнера:
источник
docker run -d -p -v /host/path:/mnt --name container_name image_name
docker cp
это односторонняя операция!Следующее - довольно уродливый способ сделать это, но это работает.
источник
docker commit `docker ps -l -q` ubuntu-with-file
. В противном случае изменения будут потеряны (используйте любое имя, которое хотите вместоubuntu-with-file
)docker exec
функцию для работы с запущенным контейнером:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
docker exec -i ...
вместо-it
, потому что нет TTY при передаче из файла.tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
Если вам нужно сделать это на работающем контейнере, вы можете использовать docker exec (добавлено в 1.3).
Сначала найдите имя контейнера или идентификатор:
В приведенном выше примере мы можем использовать
b9b7400ddd8f
илиelated_hodgkin
.Если вы хотите скопировать все
/tmp/somefiles
на хосте/var/www
в контейнер:Затем мы можем выполнить exec
/bin/bash
в контейнере и убедиться, что он работает:источник
Создайте новый файл Docker и используйте существующий образ в качестве своей базы.
Затем создайте контейнер:
источник
Решение приведено ниже,
Из оболочки Docker,
От хозяина
Файл должен быть непосредственно скопирован в место, где контейнер находится в файловой системе.
источник
Обычно есть три типа:
От контейнера к хозяину
От хозяина к контейнеру
Из контейнера в контейнер смешивается 1 и 2
источник
Другое решение для копирования файлов в работающий контейнер - использование tar:
Копирует файл
foo.sh
в/tmp
контейнер.Редактировать: Удалить излишки
-f
, благодаря комментарию Мартена .источник
-f -
Немного избыточно , хотя, по умолчанию поведения , чтобы писать на стандартный вывод в любом случае.Чтобы скопировать файл с хоста в работающий контейнер
Основано на ответе Эрика и комментариях Микла и Зора.
источник
С Docker 1.8
docker cp
может копировать файлы с хоста на контейнер. См. Сообщение в блоге Docker. Объявление Docker 1.8: Доверие к контенту, панель инструментов и обновления реестра и оркестровки .источник
docker cp foo.txt mycontainer:/foo.txt
Это прямой ответ на вопрос «Копирование файлов с хоста в Docker-контейнер», поднятый в этом вопросе в заголовке.
Попробуй
docker cp
. Это самый простой способ сделать это и работает даже на моем Mac. Применение:Это скопирует файл
some-file.txt
в каталоге/root
на вашем хост-компьютере в контейнер Docker, названныйsome-docker-container
в каталоге/root
. Это очень близко к синтаксису безопасного копирования. И, как показано в предыдущем посте, вы можете использовать его наоборот. Т.е. вы также копируете файлы из контейнера на хост.И прежде чем скачивать этот пост, пожалуйста, войдите
docker cp --help
. Чтение документации может быть очень полезным, иногда ...Если вам не нравится этот способ и вы хотите, чтобы объемы данных были в уже созданном и запущенном контейнере, тогда отдых - ваш единственный вариант сегодня. См. Также Как добавить том в существующий контейнер Docker? ,
источник
Я попробовал большинство решений (с голосованием) здесь, но в докере 17.09 (в 2018 году) больше нет папки / var / lib / docker / aufs.
Это просто
docker cp
решило эту задачу.Как получить имя контейнера?
Есть
NAMES
раздел. Не используйтеIMAGE
.источник
Чтобы скопировать файлы / папки между контейнером и локальной файловой системой, введите команду:
Например,
Чтобы получить идентификатор contianer, введите данную команду:
Вышеуказанное содержание взято с docker.com .
источник
Предполагая, что контейнер уже запущен, введите данную команду:
Чтобы поделиться файлами с помощью общего каталога, запустите контейнер, набрав следующую команду:
Примечание. Проблемы с разрешениями могут возникнуть, поскольку пользователи контейнера не совпадают с пользователями хоста.
источник
docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
cat
не будет прекращено после выхода. Если это важно для вас (если вы копируете скрипты bash, bash откажется их запускать), вам следует запуститьlsof | grep yourfilename
и завершитьcat
процесс, содержащий указанный файл.kill $(lsof | grep /path/to/file | sed ...)
. Я буду благодарен за вашу помощьkill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
Это команда для копирования данных из Docker на Host:
Ниже приведена команда для копирования данных с хоста на докер:
источник
В среде докера все контейнеры находятся в каталоге:
/var/lib/docker/aufs/required-docker-id/
Чтобы скопировать исходный каталог / файл в любую часть контейнера, введите следующую команду:
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
источник
tar
иdocker cp
хорошая комбинация для копирования всего в каталоге.Создать контейнер объема данных
Сохранить иерархию каталогов
Проверь свою работу
источник
Если хост - CentOS или Fedora, прокси-сервер НЕ включен
/var/lib/docker/aufs
, но он находится под/proc
:Этот cmd скопирует все содержимое
data
каталога в/
контейнер с идентификатором «containerid».источник
/proc
). Также расширите путь, чтобы поместить файл куда-нибудь еще, а не просто rootЕсли кому-то, вроде меня, непонятно, что
mycontainer
означает ответ @ h3nrik, на самом деле это идентификатор контейнера. Чтобы скопировать файлWarpSquare.mp4
в/app/example_scenes/1440p60
из возбужденного Docker контейнера в текущую папку , я использовал это.где
docker ps -q -l
поднимает идентификатор контейнера последнего вышедшего экземпляра. Если это не выход из контейнера, вы можете получить егоdocker container ls
илиdocker ps
источник
docker ps -a
илиdocker container ls -a
.У многих, кто находит этот вопрос, может возникнуть проблема с копированием файлов в образ Docker во время его создания (я так и сделал).
В этом случае вы можете использовать
COPY
команду,Dockerfile
которую вы используете для создания изображения.Смотрите документацию .
источник
Вы можете просто отслеживать IP-адрес вашего локального компьютера, используя
Затем просто войдите в свой контейнер Docker и введите
В любом случае, если у вас не установлены клиент и сервер SSH, просто установите его, используя:
источник
Это onliner для копирования одного файла при запуске контейнера Tomcat.
Это скопирует файл war в каталог webapps и быстро запустит ваше приложение.
источник
Синтаксис контейнера вверх:
В файле Docker
источник
Лучший способ скопировать файлы в обнаруженный мною контейнер - это смонтировать каталог на хосте с помощью
-v
команды docker run.источник
Есть хорошие ответы, но слишком конкретные. Я обнаружил, что
docker ps
это хороший способ получить интересующий вас идентификатор контейнера.чтобы увидеть, где установлен объем. Это
для меня, но это может быть другой путь в зависимости от ОС и конфигурации. Теперь просто скопируйте файлы по этому пути.
Использование
-v
не всегда практично.источник
Я только начал использовать docker для компиляции VLC, вот что вы можете сделать, чтобы копировать файлы туда и обратно из контейнеров:
Ищите знакомый файл в этом тексте, и у вас будет папка, перейдите к нему как root и вуаля! Скопируйте все, что вы хотите.
Там может быть путь с "слитым" в нем, я думаю, вы хотите тот, в котором есть "diff".
Также, если вы выходите из контейнера и хотите вернуться туда, где остановились:
Я думаю, это полезно, когда вы ничего не назвали с помощью команды, как
Конечно, хакерский метод, но что с того?
источник
Например, я хочу скопировать мой файл xxxx / download / jenkins на tomcat
Я начинаю получать идентификатор контейнера Tomcat
источник
Мой любимый метод:
КОНТЕЙНЕРЫ:
file.txt
или
источник
По моему мнению, вам не нужно копировать файлы внутри изображения, но вы можете использовать GIT или SVN для ваших файлов, а затем установить том, синхронизированный с локальной папкой. Используйте сценарий при запуске контейнера, который может проверить, существуют ли данные в локальной папке, если не скопировать их из репозитория GIT. Это делает ваш образ очень легким.
источник