Я пытаюсь смонтировать каталог хоста в контейнер Docker, чтобы любые обновления, сделанные на хосте, отражались в контейнерах Docker.
Где я делаю что-то не так. Вот что я сделал:
kishore$ cat Dockerfile
FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]
kishore$ tree . ├── Dockerfile └── main_folder ├── tfile1.txt ├── tfile2.txt ├── tfile3.txt └── tfile4.txt
1 directory, 5 files kishore$ pwd /Users/kishore/tdock
kishore$ docker build --tag=k3_s3:latest .
Uploading context 7.168 kB Uploading context Step 0 : FROM ubuntu:trusty ---> 99ec81b80c55 Step 1 : RUN apt-get update ---> Using cache ---> 1c7282005040 Step 2 : RUN apt-get -y install git curl vim ---> Using cache ---> aed48634e300 Step 3 : CMD ["/bin/bash"] ---> Running in d081b576878d ---> 65db8df48595 Step 4 : WORKDIR /test_container ---> Running in 5b8d2ccd719d ---> 250369b30e1f Step 5 : VOLUME ["/test_container"] ---> Running in 72ca332d9809 ---> 163deb2b1bc5 Successfully built 163deb2b1bc5 Removing intermediate container b8bfcb071441 Removing intermediate container d081b576878d Removing intermediate container 5b8d2ccd719d Removing intermediate container 72ca332d9809
kishore$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest
c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea
kishore$ docker run -i -t k3_s3:latest /bin/bash
root@0f17e2313a46:/test_container# ls -al total 8 drwx------ 2 root root 4096 Apr 29 05:15 . drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..
root@0f17e2313a46:/test_container# exit exit
kishore$ docker -v
Docker version 0.9.1, build 867b2a9
- Я не знаю, как проверить версию boot2docker
Вопросы, проблемы, стоящие перед:
- Как мне нужно связать main_folder с папкой test_container, которая находится внутри контейнера Docker?
- Мне нужно сделать это автоматически. Как мне сделать это без реального использования
run -d -v
команды? - Что происходит, если сбой boot2docker? Где хранятся файлы Docker (кроме Dockerfile)?
docker
mount
boot2docker
Кишоре Вайшнав
источник
источник
Ответы:
Есть несколько способов сделать это. Самый простой способ сделать это - использовать команду dockerfile
ADD
следующим образом:Однако любые изменения, внесенные в этот каталог на хосте после сборки файла dockerfile, не будут отображаться в контейнере. Это связано с тем, что при построении контейнера Docker сжимает каталог в
.tar
и постоянно выгружает этот контекст в контейнер.Второй способ сделать это - способ, которым вы пытались, - это смонтировать том. Из-за того, что вы пытаетесь быть максимально переносимым, вы не можете отобразить каталог хоста в каталог контейнера докера внутри файла Docker, потому что каталог хоста может меняться в зависимости от того, на какой машине вы работаете. Чтобы сопоставить каталог хоста с каталогом контейнера докера, вам нужно использовать
-v
флаг при запуске Docker следующим образом:источник
ADD
фактически не "монтирует", он копирует файл в контейнер, сохраняя его внутри.Пользователь этого вопроса использовал
Docker version 0.9.1, build 867b2a9
, я дам вам ответ для версии докера> = 17.06.То, что вы хотите, синхронизировать локальный каталог внутри каталога контейнера, достигается монтированием тома с типом
bind
. Это свяжет исходные (ваша система) и целевые (в контейнере Docker) каталоги. Это почти то же самое, что монтировать каталог в Linux.Согласно документации Docker , подходящая команда для монтирования теперь
mount
вместо-v
. Вот его документация:--mount
: Состоит из нескольких пар ключ-значение, разделенных запятыми. Каждая пара ключ / значение принимает форму<key>=<value>
кортежа.--mount
Синтаксис более многословен , чем-v
или--volume
, но порядок ключей не имеет существенного значения, а значение флага легче понять.type
На горе, которая может бытьbind
,volume
илиtmpfs
. (Мы собираемся использовать Bind )Горы
source
. Для bind mounts это путь к файлу или каталогу на хосте демона Docker. Может быть указано какsource
илиsrc
.В
destination
качестве значения принимает путь, по которому файл или каталог будут смонтированы в контейнере. Может быть указанdestination
,dst
илиtarget
.Итак, для монтирования текущей директории (source) с
/test_container
(target) мы будем использовать:Если эти параметры монтирования имеют пробелы, вы должны заключить их в кавычки. Когда я знаю, что нет, я бы использовал
`pwd`
вместо:Вам также придется иметь дело с разрешением файла, см. Эту статью .
источник
2 последовательных монтирования: я полагаю, что многие посты здесь могут использовать два boot2docker, потому что вы ничего не видите, потому что вы монтируете каталог из boot2docker, а не с вашего хоста.
Вам в основном нужно 2 последовательных монтирования:
1) Смонтировать локальную систему на
boot2docker
2) Смонтировать
boot2docker
файл на контейнер linuxТогда, когда вы
ls
внутри,containerfolder
вы увидите содержание вашегоhostfolder
.источник
net share
командой внутри терминала Windows (CMD). И вы должны добавить эту папку как общую папку с графическим интерфейсом virtualBox (используя то же имя, если вы следуете моей логике). Если вы опустите его, он будет работать, но вы столкнетесь с проблемами с разрешениями и обновлением производительности.mount: unknown filesystem type 'vboxsf'
используя гостевую и хост-систему Ubuntuвы можете использовать опцию -v из cli, эта возможность недоступна через Dockerfile
docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash
где host_dir - каталог с хоста, который вы хотите смонтировать. вам не нужно беспокоиться о каталоге контейнера, если он не существует, Docker создаст его.
Если вы сделаете какие-либо изменения в host_dir с хоста (под привилегией root), он будет виден контейнеру и наоборот.
источник
docker run -t -i -v /tmp:/tmp ubuntu /bin/bash
где хост/tmp
будет монтироваться на контейнере/tmp
. Теперь можноtouch /tmp/hello-world
из контейнера и увидеть, как файл появляется на хосте.Возможно ли, что вы используете Docker на OS X через
boot2docker
или что-то подобное.Я сделал то же самое - команда верна, но в контейнере ничего (разумного) все равно не установлено.
Как оказалось - это уже объяснено в документации докера . Когда вы печатаете,
docker run -v /var/logs/on/host:/var/logs/in/container ...
то/var/logs/on/host
фактически отображается изboot2docker
образа VM, а не из вашего Mac.Вам нужно будет передать общую папку через виртуальную машину на ваш реальный хост (в моем случае это Mac).
источник
[ОБНОВЛЕНИЕ] Начиная с ~ июня 2017 года, Docker для Mac заботится обо всех раздражающих частях этого, где вы должны связываться с VirtualBox. Это позволяет вам сопоставить практически все на вашем локальном хосте, используя
/private
префикс. Больше информации здесь . [/ОБНОВИТЬ]Все текущие ответы говорят о Boot2docker. Так как теперь это не рекомендуется в пользу docker-machine, это работает для docker-machine:
Сначала вставьте ssh в docker-machine vm и создайте папку, в которую мы будем отображать:
Теперь поделитесь папкой с VirtualBox:
Наконец, снова вставьте ssh в докер и подключите папку, к которой мы только что поделились:
Примечание: для UID и GID вы можете использовать любые целые числа, если они еще не заняты.
Это проверено на докер-машине 0.4.1 и докере 1.8.3 на OS X El Capitan.
источник
docker-machine
документа.-v
флаг?-v
флаг не работает так, как вы ожидаете в OS X (или Windows). Docker запускается на виртуальной машине, поэтому указанная папка-v
указывает на папку на виртуальной машине, а не в корневой ОС. Этот метод делает следующий шаг сопоставления папки VM обратно к корневой ОС./Users
для совместного использования с докером. Это означает, что если ваши рабочие файлы находятся в наличии,~/*
то все готово. Если у вас закончились настройки среды разработки/development
или у/Users
вас возникли проблемы, кроме docs.docker.com/engine/userguide/containers/dockervolumesЯ просто экспериментирую с тем, чтобы мое приложение SailsJS работало внутри контейнера Docker, чтобы поддерживать чистоту моей физической машины.
Я использую следующую команду для монтирования моего приложения SailsJS / NodeJS в / app:
источник
В моей системе я исправил ответ от nhjk, он работает безупречно, когда вы добавляете
-t
флаг.источник
Если хостом является windows 10, то вместо косой черты используйте обратную косую черту -
Убедитесь, что диск хоста является общим (C в данном случае). В моем случае я получил запрос на разрешение доступа после запуска команды, указанной выше.
источник
В Mac OS, чтобы смонтировать папку
/Users/<name>/projects/
на вашем Mac в корне вашего контейнера:docker run -it -v /Users/<name>/projects/:/projects <container_name> bash
ls /projects
источник
Обновление за июль 2015 г. - boot2docker теперь поддерживает прямое монтирование. Вы можете использовать
-v /var/logs/on/host:/var/logs/in/container
прямо из вашего приглашения Mac, без двойного монтажаисточник
Для пользователей Windows 10 важно иметь точку монтирования внутри
C:/Users/
каталога. Я часами пытался заставить это работать. Этот пост помог, но сначала он не был очевиден, поскольку решение для Windows 10 - это комментарий к принятому ответу. Вот как я это сделал:Затем, чтобы проверить это, вы можете сделать
echo TEST > hostTest.txt
внутри вашего изображения. Вы должны увидеть этот новый файл в папке локального хоста по адресуC:/Users/C/Desktop/dockerStorage/
.источник
-v $(pwd):/var/xx
сначала, и это сработало, но привело к пустой директории. Я бегу Cyg через Бабун.У меня была такая же проблема. Моя командная строка выглядела так:
Проблема была с «pwd». Поэтому я изменил это на $ (pwd):
источник
z
?Начиная с Docker 18-CE, вы можете использовать
docker run -v /src/path:/container/path
двухстороннюю привязку к папке хоста.Здесь есть одна главная проблема, если вы работаете с Windows 10 / WSL и в качестве хоста используете Docker-CE для Windows, а затем инструменты клиента docker-ce в WSL. WSL знает обо всей файловой системе /, а ваш хост Windows знает только о ваших дисках. Внутри WSL вы можете использовать / mnt / c / projectpath, но если вы попытаетесь
docker run -v ${PWD}:/projectpath
, вы найдете на хосте, что / projectpath / пуст, потому что на хосте / mnt ничего не значит.Если вы работаете с / c / projectpath, хотя и ТО,
docker run -v ${PWD}:/projectpath
и ВЫ обнаружите это в контейнере, / projectpath будет отражать / c / projectpath в реальном времени. Там нет ошибок или других способов обнаружить эту проблему, кроме как видеть пустые крепления внутри вашего гостя.Вы также должны обязательно указать «общий доступ к диску» в настройках Docker для Windows.
источник
/c/projectpath
но затем я получаю ошибкуbind mount source path does not exist: /host_mnt/c/projectpath
.Я обнаружил , что любой каталог прокладки в соответствии с директивой системы , как
/var
,/usr
,/etc
не может быть крепление в контейнере.Директива должна находиться у пользователя при
-v
переключении пробела и указывает демону docker монтировать локальный каталог в контейнер, например:источник
boot2docker вместе с гостевыми дополнениями VirtualBox
Как монтировать / Users в boot2docker
https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c
источник
Как связать main_folder с папкой test_container, находящейся внутри контейнера Docker?
Ваша команда ниже верна, если только вы не используете mac2 с помощью boot2docker (в зависимости от будущих обновлений), и в этом случае папка может оказаться пустой. См. Ответ Mattes для учебника по исправлению этого.
Мне нужно сделать этот запуск автоматически, как это сделать без использования команды run -d -v.
Вы не можете по-настоящему уйти от использования этих команд, они свойственны тому, как работает докер. Лучше всего поместить их в сценарий оболочки, чтобы не записывать их повторно.
Что произойдет, если boot2docker вылетит? Где хранятся файлы докеров?
Если вам удастся использовать -v arg и сослаться на ваш хост-компьютер, то файлы будут в безопасности на вашем хосте.
Если вы использовали 'docker build -t myimage.' с Dockerfile ваши файлы будут запечены в образ.
Я полагаю, что ваши образы докеров хранятся в boot2docker-vm. Я узнал об этом, когда мои изображения исчезли, когда я удаляю виртуальную машину из VirtualBox. (Обратите внимание, я не знаю, как работает Virtualbox, поэтому изображения могут быть скрыты где-то еще, просто не видны для докера).
источник
Была такая же проблема. Нашел это в документации докера :
Таким образом, монтирование директории хоста для чтения / записи возможно только с
-v
параметром вdocker run
команде, так как остальные ответы указывают правильно.источник
Вот пример с путем Windows:
В качестве примечания: во время всего этого растягивания волос, когда приходится ломать голову над поиском и переписывать пути снова и снова, я решил создать небольшой
AutoHotkey
скрипт, чтобы преобразовать путь Windows в «Docker Windows». , » отформатированный путь , Таким образом, все, что мне нужно сделать, - это скопировать любой путь Windows, который я хочу использовать в качестве точки монтирования, в буфер обмена, нажать «клавишу приложений» на клавиатуре, и он отформатирует его в формате пути, который оценит Docker.Например:
Скопируйте это в буфер обмена:
C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr
нажмите на
Apps Key
курсор, когда вы хотите, чтобы он был в командной строке, и он вставит его туда:"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"
Экономит много времени для меня. Вот это для всех, кто может найти это полезным.
источник
Чтобы это работало в Windows 10, мне пришлось открыть окно настроек Docker из панели задач и перейти в раздел « Общие диски ».
Затем я установил флажок рядом с
C
. Докер запросил мои учетные данные на рабочем столе, чтобы получить разрешение на запись в мою папку «Пользователи».Затем я запустил Docker-контейнер, следуя приведенным выше примерам, а также примеру на этой странице настроек, прикрепляя его к
/data
контейнеру.источник
Обратите внимание, что в Windows вам нужно будет указать абсолютный путь.
Ниже работал для меня.
источник
у меня были те же проблемы, я пытался смонтировать папку C: \ Users \ на докере,
вот как я это сделал, командная строка Docker Toolbox
источник
У меня было такое же требование, чтобы смонтировать каталог хоста из контейнера, и я использовал команду тома монтирования. Но во время тестирования заметил, что он также создает файлы внутри контейнера, но после некоторого копания обнаружил, что это просто символические ссылки и фактическая файловая система, используемая с хост-машины.
источник
Вы также можете сделать это с помощью веб-приложения Portainer для другого визуального восприятия.
Сначала потяните изображение Portainer:
Затем создайте том для Portainer:
Также создайте контейнер Portainer:
Вы сможете получить доступ к веб-приложению через браузер по этому адресу: « http: // localhost: 9000 ». При первом входе в систему вам будет предложено установить учетные данные администратора Portainer.
В веб-приложении выполните следующие меню и кнопки: (Контейнер> Добавить контейнер> Параметры заполнения> Развернуть контейнер)
У меня были проблемы с созданием тома «монтирования» с помощью Portainer, и я понял, что при создании тома моего контейнера мне пришлось нажимать «связать». Ниже приведена иллюстрация настроек привязки тома, которые работали для создания моего контейнера с подключенным томом, привязанным к хосту.
PS: я использую Docker 19.035 и Portainer 1.23.1
источник