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

618

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

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

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

Ответы:

509

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

ADD . /path/inside/docker/container

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

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

docker run -v /host/directory:/container/directory -other -options image_name command_to_run
nhjk
источник
Я пробовал вот так: $ docker -v / Users / kishore / main_folder: / test_container Docker версия 0.9.1, сборка 867b2a9 COMMAND] [ARG ...] Запустить команду в новом контейнере -P, --publish-all = false: опубликовать все открытые порты на интерфейсах хоста -a, --attach = []: подключить к stdin, stdout или STDERR. -c, --cpu-shares = 0: доли процессора (относительный вес)
Кишоре Вайшнав,
2
Вы можете иметь оба ДОБАВИТЬ. и -v громкость монтирования одновременно. использовать app_dir по умолчанию, если не указать хост-монтирование?
alexzg
@alexzg Я не думаю, что мы можем иметь приоритет только перед первым. Кроме того, я не уверен насчет вашей второй точки по умолчанию app_dir ... host mount ..?
Кишоре Вайшнав
35
Это работало для меня на Mac OS X с Docker-машиной и VirtualBox. Одно замечание, которое я обнаружил методом проб и ошибок, заключается в том, что каталог хоста должен быть полным, а не относительным путем.
Jbustamovej
25
ADDфактически не "монтирует", он копирует файл в контейнер, сохраняя его внутри.
к
200

Пользователь этого вопроса использовал 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) мы будем использовать:

    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

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

Эдуардо Сантана
источник
2
Я проголосовал за ваш ответ, потому что мне нравится, насколько он лаконичен и не ошибается, но вы можете обновить его в свете моего ответа на stackoverflow.com/a/51829247/901899
rainabba
2
Я предполагаю, что документация была обновлена ​​после этого ответа, так как сейчас, похоже, рекомендуются тома, а не монтирования. Стоит хотя бы пройтись, прежде чем совершать что-либо.
Сипти
1
@Sipty может иметь в виду следующее: « Если вы разрабатываете новые приложения Docker, рассмотрите возможность использования именованных томов . Вы не можете использовать команды Docker CLI для непосредственного управления монтированием bind ».
Aluthren
81

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.

Луис V
источник
1
Лучший ответ. Я должен добавить, что (под windows) hostfolder в команде mount ссылается на имя общей папки. Тот, который появляется с net shareкомандой внутри терминала Windows (CMD). И вы должны добавить эту папку как общую папку с графическим интерфейсом virtualBox (используя то же имя, если вы следуете моей логике). Если вы опустите его, он будет работать, но вы столкнетесь с проблемами с разрешениями и обновлением производительности.
Кир Канос
как команда mount знает хост, где находится / boot2dockerfolder?
Альфонсодев
Я получил ошибку:, mount: unknown filesystem type 'vboxsf'используя гостевую и хост-систему Ubuntu
nnyby
«vboxsf» - это драйвер «файловой системы» для общей папки VirtualBox. Он должен быть настроен в ВМ путем установки расширений VirtualBox. На образе boot2docker они не должны быть установлены. VirtualBox имеет функцию «устройства» для «вставки» образов ISO VirtualBox Additions в качестве виртуального тома. Обычно вы можете смонтировать это при монтировании, используя mount / dev / cdrom / mnt, зайдя в / mnt и запустив bash VBoxLinuxAdditions. Может потребоваться установка gcc, kernel или других зависимостей.
Эндрю Вулф,
mount.vboxsf: не монтаж потерпела неудачу с ошибкой: Нет такого файла или каталога не установки: монтаж mymapfoldername на / boot2dockerfolder не удалось: Нет такого файла или каталога
Vee
71

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

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

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

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

rgaut
источник
6
Какой хороший, чистый, точный пример, иллюстрирующий опцию монтирования хоста. Возможно, это можно улучшить с помощью реального каталога: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashгде хост /tmpбудет монтироваться на контейнере /tmp. Теперь можно touch /tmp/hello-worldиз контейнера и увидеть, как файл появляется на хосте.
Стефан Хеннингсен
3
Работает отлично. Но монтирование таким способом устанавливает владельца каталога как root, а также ожидает, что контейнер будет запущен как root. Как мы монтируем dir как не-root, когда контейнер запускается как non-root?
Арун
33

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

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

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

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

user3680997
источник
1
Спасибо! Это помогло мне с отдаленно связанной проблемой. Postgres, работающий внутри Docker, связывался с IP-адресом VBox, а не с localhost, как если бы он не работал на OS X.
Peter Becich
2
Этот URL к документации докера больше не действителен
digitaldavenyc
хаха лучшая шутка когда-либо .. они действительно могли бы намекнуть или около того.
user2834172
2
Ссылка на вашу документацию 404
Фактор Мистик
3
Мне любопытно увидеть пример передачи общей папки через виртуальную машину на реальный хост.
Дерек
28

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

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

Сначала вставьте 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 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.

Eli
источник
1
+1. После нескольких часов стука в мою голову ваш ответ сработал. Это должно быть частью docker-machineдокумента.
Абхиджит Саркар
Почему бы не использовать -vфлаг?
igracia
1
@igracia -vфлаг не работает так, как вы ожидаете в OS X (или Windows). Docker запускается на виртуальной машине, поэтому указанная папка -vуказывает на папку на виртуальной машине, а не в корневой ОС. Этот метод делает следующий шаг сопоставления папки VM обратно к корневой ОС.
Патрик Гандерсон
1
@PatrickGunderson В моем случае (OS X) папка находится в хосте, а не в виртуальной машине, и работает нормально. Docker Tolls позаботится об экспорте его в виртуальную машину и оттуда в контейнер.
igracia
1
Единственное исключение из упомянутого правила состоит в том, что виртуальная машина автоматически подключается /Usersдля совместного использования с докером. Это означает, что если ваши рабочие файлы находятся в наличии, ~/*то все готово. Если у вас закончились настройки среды разработки /developmentили у /Usersвас возникли проблемы, кроме docs.docker.com/engine/userguide/containers/dockervolumes
Патрик Гандерсон,
27

Я просто экспериментирую с тем, чтобы мое приложение 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
Sven
источник
5
Как это можно сделать в Dockerfile?
Орад
23
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флаг.

Али
источник
Можете ли вы создавать / обновлять файлы из локальной FS и видеть изменения внутри контейнера Docker?
Ави Мехенвал
14

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

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

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

Duke79
источник
13

В Mac OS, чтобы смонтировать папку /Users/<name>/projects/на вашем Mac в корне вашего контейнера:

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects

bormat
источник
11

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

Tal
источник
11

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

KF
источник
Двойная косая черта на пути - вот что заставило меня работать. Это сбивало с толку, потому что я использовал -v $(pwd):/var/xxсначала, и это сработало, но привело к пустой директории. Я бегу Cyg через Бабун.
Кенчилада
Возникла та же проблема в Windows 7 при использовании / c / data /, перемещение каталога хоста в / c / Users / <пользователь> / решило ее для меня. Спасибо.
user8675309
1
у нас может быть ссылка на пост, который помог вам решить проблему?
PBo
11

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

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

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

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME
NikitQa
источник
1
Для чего z?
HHH
2
Параметр z указывает, что содержимое монтирования для связывания используется несколькими контейнерами.
Джейсон
10

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

rainabba
источник
У меня эта проблема с Win10 / WSL и Docker-CE / docker-ce. Пусто / путь к проекту /. Что вы подразумеваете под «работой из / c / projectpath»? Я попытался связать / c / to / mnt / c и запустить с, /c/projectpathно затем я получаю ошибку bind mount source path does not exist: /host_mnt/c/projectpath.
Стивен Т. Снайдер
Эта ссылка решила мою проблему: support.divio.com/local-development/docker/… (Docker в Windows разрешает монтировать только из / Users / по умолчанию)
Стивен Т. Снайдер,
7

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

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

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}
Мансур Али
источник
5

boot2docker вместе с гостевыми дополнениями VirtualBox
Как монтировать / Users в 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.

Штейн
источник
Я попытался использовать этот iso, и я все еще сталкивался с теми же проблемами ... Использование указаний, изложенных в этом посте, помогло мне разобраться с этим - мне пришлось в основном форсировать общую папку.
Джако Преториус
Я использовал iso, он наткнулся на то, что я не остановил виртуальную виртуальную машину до вызова cmd 'VBoxManage sharedfolder add ...'. Наконец-то все заработало, хотя огромное спасибо.
Эмиль
Примечание: причина, по которой -v arg не работает через boot2docker, по-видимому, связана с тем, что он подключается к boot2docker-vm, а не к вашему фактическому хосту. вот почему я думаю, что часть Vboxmanage помогает ему работать.
Эмиль
5

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

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

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

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

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

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

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

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

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

Emile
источник
5

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

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

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

Маттеус
источник
Что такое каталог хоста?
Nicolas S.Xu
@ NicolasS.Xu Любой путь на фактическом хосте докера.
Дж. Скотт Элблейн
5

Вот пример с путем 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's 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's 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 
Дж. Скотт Элблейн
источник
4

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

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

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

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
Адам Смит
источник
3

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

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

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash
Чанки патхак
источник
3

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

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>
Абхишек Д.К.
источник
2

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

Сунил Чаураха
источник
2

Вы также можете сделать это с помощью веб-приложения Portainer для другого визуального восприятия.

Сначала потяните изображение Portainer:

docker pull portainer/portainer

Затем создайте том для Portainer:

docker volume create portainer_data

Также создайте контейнер Portainer:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Вы сможете получить доступ к веб-приложению через браузер по этому адресу: « http: // localhost: 9000 ». При первом входе в систему вам будет предложено установить учетные данные администратора Portainer.

В веб-приложении выполните следующие меню и кнопки: (Контейнер> Добавить контейнер> Параметры заполнения> Развернуть контейнер)

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

настройки привязки громкости

PS: я использую Docker 19.035 и Portainer 1.23.1

Майкл Файяд
источник