Как смонтировать каталог хоста в Docker-контейнере

Я пытаюсь смонтировать каталог хоста в контейнер 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: последний c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

[email protected]:/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

Вопросы, проблемы, стоящие перед:

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

Ответ 1

Есть несколько способов сделать это. Самый простой способ сделать это - использовать команду dockerfile ADD следующим образом:

ADD . /path/inside/docker/container

Однако любые изменения, внесенные в этот каталог на хосте после создания файла docker, не будут отображаться в контейнере. Это связано с тем, что при создании контейнера докер сжимает каталог в .tar и постоянно загружает этот контекст в контейнер.

Второй способ сделать это - это то, как вы пытались, чтобы установить громкость. Из-за того, что вы пытаетесь быть максимально переносимыми, вы не можете сопоставить каталог хоста в каталоге контейнера докеров в файле докеров, поскольку каталог хоста может меняться в зависимости от того, на каком компьютере вы работаете. Чтобы сопоставить каталог хоста с каталогом контейнера докеров, вам нужно использовать флаг -v при использовании запуска docker следующим образом:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run

Ответ 2

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

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

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

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

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

  • source горы. Для bind mounts это путь к файлу или каталогу на хосте демона Docker. Может быть указан в качестве source или src.

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

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

    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

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

Ответ 3

2 последовательных крепления: Я полагаю, что во многих сообщениях здесь могут использоваться два загрузчика boot2docker. Причина, по которой вы ничего не видите, заключается в том, что вы монтируете каталог из boot2docker, а не с вашего хоста.

Вам нужно 2 последовательных монтирования:

первый, чтобы смонтировать каталог с вашего хоста в вашу систему

вторая - для монтирования нового каталога из boot2docker в ваш контейнер следующим образом:

  • 1) Смонтируйте локальную систему на boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) Смонтировать файл boot2docker в контейнер linux

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

Затем, когда вы ls внутри containerfolder, вы увидите содержимое вашего hostfolder.

Ответ 4

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

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

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

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

Ответ 5

Возможно ли, что вы используете докер в OS X через boot2docker или что-то подобное.

Я сделал то же самое - команда правильная, но ничто (разумное) не монтируется в контейнере, в любом случае.

Как выясняется - это уже объяснено в документации docker. Когда вы вводите docker run -v /var/logs/on/host:/var/logs/in/container ..., тогда /var/logs/on/host фактически отображается из образа boot2docker VM, а не вашего Mac.

Вам нужно будет передать общую папку через вашу виртуальную машину на ваш фактический хост (Mac в моем случае).

Ответ 6

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

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

Сначала вставьте ssh в виртуальную машину Docker и создайте папку, в которую мы будем отображать:

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 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.

Ответ 7

Я просто экспериментирую с тем, что приложение SailsJS работает внутри контейнера Docker, чтобы моя физическая машина была чистой.

Я использую следующую команду для монтирования приложения SailsJS/NodeJS в /app:

cd my_source_code_folder
docker run -it -p 1337:1337 -v $(pwd):/app my_docker/image_with_nodejs_etc

Ответ 8

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.

Ответ 9

Обновление Jul 2015 - теперь boot2docker поддерживает прямой монтаж. Вы можете использовать -v /var/logs/on/host:/var/logs/in/container непосредственно из подсказки Mac, без двойной установки

Ответ 10

У меня была такая же проблема. Моя командная строка выглядела так:

docker run --rm -i --name $NAME -v 'pwd':/sources:z $NAME

Проблема была с "pwd". Поэтому я изменил это на $ (pwd):

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME

Ответ 11

Если хостом является windows 10, то вместо косой черты используйте обратную косую черту -

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

Убедитесь, что диск хоста является общим (C в данном случае). В моем случае я получил запрос на разрешение доступа после выполнения команды, приведенной выше.

Ответ 12

Начиная с 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.

Ответ 13

Для пользователей 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/.

Ответ 14

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

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

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

Ответ 15

boot2docker вместе с гостевыми дополнениями VirtualBox
Как монтировать/Пользователи в boot2docker

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr Создайте свой собственный boot2docker.iso с гостевыми дополнениями VirtualBox (см. ссылку) или загрузите http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso и сохраните его в ~/.boot2docker/boot2docker.iso.

Ответ 16

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

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

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

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

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

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

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

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

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

Ответ 17

Была та же проблема. Обнаружено это в документации docker:

Примечание. Каталог хоста по своей природе зависит от хоста. По этой причине вы не можете установить каталог хоста из Dockerfile, инструкция VOLUME не поддерживает передачу host-dir, поскольку созданные изображения должны быть переносимыми. Каталог хоста не будет доступен для всех потенциальных хостов.

Таким образом, установка каталога хоста чтения/записи возможна только с параметром -v в команде docker run, так как другие ответы указывают правильно.

Ответ 18

Вот пример с путем Windows:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

В качестве примечания: во время всего этого растягивания волос, когда приходится ломать голову над поиском и переписывать пути снова и снова, я решил создать небольшой скрипт AutoHotkey для преобразования пути Windows в формат "Docker Windows". дорожка. Таким образом, все, что мне нужно сделать, - это скопировать любой путь Windows, который я хочу использовать в качестве точки монтирования, в буфер обмена, нажать "клавишу приложений" на клавиатуре, и он отформатирует его в формате пути, который оценит Docker.

Например:

Скопируйте это в буфер обмена:

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

нажмите клавишу Apps Key когда курсор находится там, где вы хотите, в командной строке, и он вставит это туда:

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

Экономит много времени для меня. Вот это для всех, кто может найти это полезным.

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 

Ответ 19

Обратите внимание, что в Windows вам нужно будет указать абсолютный путь.

Ниже работал для меня.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash

Ответ 20

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

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

Ответ 21

Чтобы это работало в Windows 10, мне пришлось открыть окно настроек Docker из панели задач и перейти в раздел Общие диски.

Затем я установил флажок рядом с C. Докер запросил мои учетные данные на рабочем столе, чтобы получить разрешение на запись в мою папку "Пользователи".

Затем я запустил Docker-контейнер, следуя приведенным выше примерам, а также примеру на этой странице настроек, прикрепив его к /data в контейнере.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options

Ответ 22

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