boot2docker mount file - Как установить каталог хоста в контейнере Docker





9 Answers

Пользователь этого вопроса использовал Docker version 0.9.1, build 867b2a9 , я дам вам ответ для версии докера> = 17.06.

То, что вы хотите, сохранить локальный каталог, синхронизированный в каталоге контейнера, выполняется путем установки тома с bind типа. Это приведет к связыванию директорий источника (вашей системы) и целевого (в контейнере докера). Это почти то же самое, что установка каталога в Linux.

Согласно документации Docker , соответствующая команда для монтирования теперь mount вместо -v . Вот его документация:

  • --mount : Состоит из нескольких пар ключ-значение, разделенных запятыми. Каждая пара ключей / значений принимает форму кортежа <key>=<value> . Синтаксис --mount является более подробным, чем -v или --volume , но порядок ключей незначителен, а значение флага легче понять.

  • type монтирования, который может быть bind , volume или tmpfs . (Мы собираемся использовать bind )

  • source монтирования. Для монтирования привязок это путь к файлу или каталогу на хосте docker daemon. Может указываться как source или src .

  • destination принимает в качестве значения путь, в котором файл или каталог будет установлен в контейнере. Может указываться как destination , dst или target .

Итак, чтобы установить текущий каталог (источник) с помощью /test_container (target), мы будем использовать:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

Если эти параметры монтирования имеют пробелы, вы должны помещать кавычки вокруг них. Когда я знаю, что они этого не делают, вместо этого я буду использовать `pwd` :

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

Вам также придется иметь дело с разрешением файла, см. Эту статью .

volume windows persistent

Я пытаюсь установить каталог хоста в контейнер Docker, чтобы любые обновления, сделанные на хосте, отражались в контейнерах Docker. Я не смог добиться успеха после поиска в Google и чтения ссылок на докеры.

Где я делаю что-то неправильно. Вот что я сделал:

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 / Пользователи / kishore / main_folder: / test_container k3_s3: последние 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 выход

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • Я не знаю, как проверить версию boot2docker

Вопросы и проблемы:

  1. Как мне связать основную папку с папкой test_container, находящейся внутри контейнера докеров?
  2. Мне нужно сделать это автоматически. Как мне это сделать без использования команды run -d -v ?
  3. Что произойдет, если сбой boot2docker? Где хранятся файлы Docker (кроме Dockerfile)?



вы можете использовать параметр -v из cli, этот объект недоступен через Dockerfile

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

где host_dir - это каталог с хоста, который вы хотите установить. вам не нужно беспокоиться о каталоге контейнера, если он не существует. Докер будет его создавать.

Если вы внесете какие-либо изменения в host_dir с хост-компьютера (под привилегиями root), он будет виден контейнеру и наоборот.




[ДОПОЛНЕНО] Начиная с ~ июня 2017 года, Docker для Mac заботится обо всех досадных частях этого, где вам нужно общаться с VirtualBox. Он позволяет отображать в основном все на вашем локальном узле с использованием префикса /private . Больше информации here . [/ОБНОВИТЬ]

Все текущие ответы говорят о Boot2docker. Так как это теперь устарело в пользу докер-машины, это работает на докер-машине:

Во-первых, ssh в docker-machine vm и создайте папку, в которую мы будем сопоставлять:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

Теперь поделитесь папкой с VirtualBox:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

Наконец, ssh в docker-machine снова и смонтируйте папку, которую мы только что разделили:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

Примечание: для UID и GID вы можете в принципе использовать любые целые числа, если они еще не приняты.

Это проверено как на докер-машине 0.4.1 и докер 1.8.3 на OS X El Capitan.




docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

В моей системе я исправил ответ от nhjk, он работает безупречно, когда вы добавляете флаг -t .




Я обнаружил, что любая директория, лежащая под системной директивой типа /var , /usr , /etc не может монтироваться под контейнером.

Директива должна находиться в пространстве пользователя. -v переключатель указывает демонам докеров подключить локальный каталог к ​​контейнеру, например:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}



Как связать основную папку с папкой test_container, находящейся внутри контейнера докеров?

Ваша приведенная ниже команда верна, если только вы не используете mac-файл с помощью boot2docker (в зависимости от будущих обновлений), и в этом случае вы можете найти папку пустым. См. Mattes answer для руководства по исправлению этого.

docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

Мне нужно сделать этот запуск автоматически, как это сделать, не используя команду run -d -v.

Вы не можете уйти от использования этих команд, они неотъемлемы от того, как работает докер. Вам было бы лучше положить их в сценарий оболочки, чтобы вы могли писать их повторно.

Что произойдет, если сбой boot2docker? Где хранятся файлы докеров?

Если вам удастся использовать -v arg и ссылаться на ваш хост-компьютер, тогда файлы будут безопасными на вашем хосте.

Если вы использовали 'docker build -t myimage.' с файлом Docker, тогда ваши файлы будут испечены в изображении.

Ваши изображения докеров, я считаю, хранятся в boot2docker-vm. Я узнал об этом, когда мои изображения исчезли, когда я удаляю vm из VirtualBox. (Заметьте, я не знаю, как работает Virtualbox, поэтому изображения могут быть все еще скрыты в другом месте, просто не видны докере).




Начиная с 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, а THEN do docker run -v ${PWD}:/projectpath и вы обнаружите, что в контейнере / projectpath будет отображать / c / projectpath в реальном времени. Нет ошибок или других способов обнаружить эту проблему, кроме как видеть пустое монтирование внутри вашего гостя.

Вы также должны быть уверены, что «делите диск» в настройках Docker для Windows.




У меня были такие же проблемы, я пытался установить папку C: \ Users \ на докере
так я сделал это в командной строке Docker Toolbox

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>



Для пользователей Windows 10 важно иметь точку монтирования внутри каталога C:/Users/ . Я много часов пытался заставить это работать. Это сообщение помогло, но сначала это было не очевидно, так как решение для Windows 10 является комментарием к принятому ответу. Вот как я это сделал:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

Затем, чтобы протестировать его, вы можете сделать echo TEST > hostTest.txt внутри вашего изображения. Вы должны увидеть этот новый файл в локальной папке хоста на C:/Users/C/Desktop/dockerStorage/ .




Related