Как монтировать локальные Тома в docker machine
Я пытаюсь использовать docker-machine с docker-compose. Файл docker-compose.yml имеет следующие определения:
web:
build: .
command: ./run_web.sh
volumes:
- .:/app
ports:
- "8000:8000"
links:
- db:db
- rabbitmq:rabbit
- redis:redis
при работе docker-compose up -d
все идет хорошо, пока не попытается выполнить команду и не появится ошибка:
не удается запустить контейнер b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d: [8] системная ошибка: exec:". /run_web.sh": stat. /run_web.sh: нет такого файла или каталога
локальные Тома не являются монтируется на удаленной машине. Какова рекомендуемая стратегия монтирования локальных томов с помощью кода webapps?
11 ответов:
также столкнулся с этой проблемой, и похоже, что локальные Тома не монтируются при использовании docker-machine. Хак решение является
получить текущий рабочий каталог экземпляра docker-machine
docker-machine ssh <name> pwd
использовать инструмент командной строки, как
rsync
для копирования папки в удаленную системуrsync -avzhe ssh --progress <name_of_folder> username@remote_ip:<result _of_pwd_from_1>.
по умолчанию pwd - это / root, поэтому команда выше будет
rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root
NB: вам понадобится чтобы ввести пароль для удаленной системы. Вы можете быстро создать его по ssh в удаленной системе и создать пароль.
измените точку монтирования громкости в вашем С
.:/app
до/root/<name_of_folder>:/app
выполнить
docker-compose up -d
NB когда изменения вносятся локально, не забудьте повторить
rsync
для переноса изменений в удаленную систему.его не идеально, но это работает. Проблема продолжается https://github.com/docker/machine/issues/179
другие проекты, которые пытаются решить эту проблему включают настройки-синхронизировать
Docker-машина автоматически монтирует каталог пользователей... Но иногда этого просто недостаточно.
я не знаю о докере 1.6, но в 1.8 вы можете добавить дополнительное крепление к docker-machine
добавить точку монтирования виртуальной машины (Часть 1)
CLI: (работает только при остановке машины)
VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automount
так что пример в Windows будет
/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe sharedfolder add default --name e --hostpath 'e:\' --automount
GUI: (не требует остановки машины)
- запустите "Oracle VM VirtualBox Manager"
- Щелкните Правой Кнопкой Мыши
<machine name>
(по умолчанию)- настройки...
- Общие Папки
- папка+ значок справа (добавить долю)
- Путь К Папке:
<host dir>
(e:)- Папки Имя:
<mount name>
(e)- Проверьте "автоматическое крепление" и "сделать постоянным" (читать только если вы хотите...) (Автоматическое крепление вроде бессмысленно в настоящий момент...)
установка в boot2docker (часть 2)
монтировать вручную в boot2docker:
- есть различные способы войти в систему, использовать "Show" в "Oracle VM VirtualBox Manager" или ssh/putty в docker по IP-адресу
docker-machine ip default
и т. д...sudo mkdir -p <local_dir>
sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
но это только хорошо, пока вы не перезагрузите машину, а затем крепление потерянный...
добавление автомонтажа в boot2docker:
при входе в машину
- изменить/создать (как root)
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1 может отличаться для вас...добавить
mkdir -p <local_dir> mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
С этими изменениями, вы должны иметь новую точку монтирования. Это один из немногих файлов, которые я мог найти, который вызывается при загрузке и является постоянным. Пока нет лучшего решения, это должно работа.
старый метод: меньше рекомендуемого, но оставили в качестве альтернативы
- изменить (как root)
/mnt/sda1/var/lib/boot2docker/profile
, sda1 может отличаться для вас...добавить
add_mount() { if ! grep -q "try_mount_share " /etc/rc.d/automount-shares ; then echo "try_mount_share " >> /etc/rc.d/automount-shares fi } add_mount <local dir> <mount name>
как в крайнем случае, вы можете взять немного более утомительную альтернативу, и вы можете просто изменить загрузку изображение.
git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
cd boot2docker
git -c core.autocrlf=false checkout v1.8.1
#или соответствующая версия- Edit
rootfs/etc/rc.d/automount-shares
добавить
try_mount_share <local_dir> <mount_name>
линия прямо перед fi в конце. Напримерtry_mount_share /e e
просто не устанавливайте ничего, что нужно ОС, например /bin и т. д...
docker build -t boot2docker .
#это займет около часа в первый раз :(docker run --rm boot2docker > boot2docker.iso
- резервное копирование старый boot2docker.iso и скопируйте новый на свое место, в~/.докер / машина / машины/
это работает, это просто долго и сложно
настройки версии 1.8.1, докер-машина версии 0.4.0
на данный момент я не вижу никакого способа монтировать Тома на машинах, поэтому подход к настоящему времени будет заключаться в том, чтобы каким-то образом скопировать или синхронизировать файлы, которые вам нужны, в машину.
здесь разговоры о том, как решить эту проблему в репозитории GitHub docker-machine. Кто-то сделал pull-запрос реализация scp на docker-machine и он уже объединен на master, поэтому очень вероятно, что следующий релиз будет включать оно.
поскольку он еще не выпущен, я бы рекомендовал, чтобы если у вас есть код, размещенный на github, просто клонируйте свое РЕПО перед запуском приложения
web: build: . command: git clone https://github.com/my/repo.git; ./repo/run_web.sh volumes: - .:/app ports: - "8000:8000" links: - db:db - rabbitmq:rabbit - redis:redis
обновление: глядя дальше, я обнаружил, что эта функция уже доступна в последние файлы, когда вы их получите, вы сможете скопировать свой локальный проект, Выполнив такую команду:
docker-machine scp -r . dev:/home/docker/project
это общий вид:
docker-machine scp [machine:][path] [machine:][path]
Так что вы можете копировать файлы от, К и между машинами.
Ура!1
если вы выберете опцию rsync с docker-machine, вы можете объединить ее с такой:
rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<host_directory_to_sync_to>
он использует этот формат команды rsync, оставляя
HOST
пусто:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
С октября 2017 года появилась новая команда для docker-machine, которая делает трюк, но перед ее выполнением убедитесь, что в каталоге ничего нет, иначе она может потеряться:
docker-machine mount <machine-name>:<guest-path> <host-path>
проверьте документы для получения дополнительной информации:https://docs.docker.com/machine/reference/mount/
PR с изменением:https://github.com/docker/machine/pull/4018
Я полагаю,
run_web.sh
файл находится в том же каталоге, что и ваш . Тогда команда должна бытьcommand: /app/run_web.sh
.если
Dockerfile
(что вы не раскрываете) заботится о том, чтобы положитьrun_web.sh
файл в образ Докера.
после суммирования сообщений здесь, прикрепленный обновленный скрипт, чтобы создать дополнительную точку монтирования хоста и автомонтировать при перезапуске Virtualbox. Рабочая среда кратко, как показано ниже: - Windows 7 - докер-машина.exe-версию 0.7.0 - VirtualBox 5.0.22
#!env bash : ${NAME:=default} : ${SHARE:=c/Proj} : ${MOUNT:=/c/Proj} : ${VBOXMGR:=C:\Program Files\Oracle\VirtualBox\VBoxManage.exe} SCRIPT=/mnt/sda1/var/lib/boot2docker/bootlocal.sh ## set -x docker-machine stop $NAME "$VBOXMGR" sharedfolder add $NAME --name c/Proj --hostpath 'c:\' --automount 2>/dev/null || : docker-machine start $NAME docker-machine env $NAME docker-machine ssh $NAME 'echo "mkdir -p $MOUNT" | sudo tee $SCRIPT' docker-machine ssh $NAME 'echo "sudo mount -t vboxsf -o rw,user $SHARE $MOUNT" | sudo tee -a $SCRIPT' docker-machine ssh $NAME 'sudo chmod +x /mnt/sda1/var/lib/boot2docker/bootlocal.sh' docker-machine ssh $NAME 'sudo /mnt/sda1/var/lib/boot2docker/bootlocal.sh' #docker-machine ssh $NAME 'ls $MOUNT'
наконец-то понял, как обновить Windows Docker Toolbox до v1.12.5 и сохранить мои Тома, добавив общую папку в
Oracle VM VirtualBox
менеджер и отключение преобразования пути. Если у вас есть Windows 10+, то вам лучше использовать более новый Докер для Windows.1-я боль обновления:
- Сначала удалите VirtualBox.
- Да, что может сломать вещи в других инструментах, таких как Android Studio. Спасибо Докер : (
- Установите новую версию Docker Toolbox.
Redis Пример Базы Данных:
redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"
В Терминале Быстрого Запуска Docker ....
- выполнить
docker-machine stop default
- убедитесь, что VM перевозитсяв Oracle VM VirtualBox Manager ...
- добавлена общая папка в
default
VM через или командной строки
D:\Projects\MyProject\db
=>/var/db
на
docker-compose.yml
...
- сопоставленный объем redis как:
"/var/db/redis:/data:rw"
В Терминале Быстрого Запуска Docker ....
- Set
COMPOSE_CONVERT_WINDOWS_PATHS=0
(для версии Toolbox >= 1.9.0)- выполнить
docker-machine start default
для перезапуска виртуальной машины.cd D:\Projects\MyProject\
docker-compose up
должно работать.теперь создает базу данных redis в
D:\Projects\MyProject\db\redis\dump.rdb
почему избегайте относительных путей хоста?
я избегал относительных путей хоста для Windows Toolbox, поскольку они могут вводить недопустимые символы'\'. Это не так приятно, как использовать пути относительно
docker-compose.yml
но, по крайней мере, мои коллеги-разработчики могут легко сделать это, даже если их папке проекта находится в другом месте без того, чтобы взломатьdocker-compose.yml
файл (плохо для SCM).Оригинальный Вопрос
к вашему сведению ... Вот оригинальная ошибка, которую я получил, когда использовал nice чистые относительные пути, которые раньше работали просто отлично для старых версий. Мое отображение объема раньше было просто
"./db/redis:/data:rw"
ERROR: for redis Cannot create container for service redis: Invalid bind mount spec "D:\Projects\MyProject\db\redis:/data:rw": Invalid volume specification: 'D:\Projects\MyProject\db\redis:/data
происходит это по двум причинам ..
- он не может получить доступ к
D:
диск- пути Тома не могут включать
\
символы
docker-compose
добавляет их, а затем обвиняет вас в этом !!- использовать
COMPOSE_CONVERT_WINDOWS_PATHS=0
чтобы прекратить эту чушь.I рекомендуется документировать дополнительное сопоставление общих папок виртуальной машины в вашем
docker-compose.yml
файл, так как вам может потребоваться снова удалить VirtualBox и сбросить общую папку, и в любом случае ваши коллеги-разработчики будут любить вас за это.
Я использую docker-machine 0.12.2 с диском virtualbox на моей локальной машине. Я обнаружил, что есть каталог
/hosthome/$(user name)
откуда у вас есть доступ к локальным файлам.
просто подумал, что я упомянул, что я использую 18.03.1-ce-win65 (17513) в Windows 10, и я заметил, что если вы ранее делили диск и кэшировали учетные данные, как только вы измените свой пароль, docker начнет устанавливать Тома в контейнерах как пустые.
Это не дает никаких указаний на то, что на самом деле происходит, что теперь он не может получить доступ к общим со старыми кэшированными учетными данными. Решение в этом сценарии заключается в сбросе учетных данных либо через пользовательский интерфейс (настройки->Общие диски) или отключить затем переименовать общий доступ к диску и введите новый пароль.
было бы полезно, если docker-compose дал ошибку в этих ситуациях.