Я пытаюсь использовать 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: нет такого файла или каталога
Локальные тома не подключаются к удаленному компьютеру. Какая стратегия рекомендуется для монтирования локальных томов с помощью кода веб-приложений?
docker
dockerfile
docker-compose
jdcaballerov
источник
источник
Ответы:
Docker-machine автоматически монтирует каталог пользователей ... Но иногда этого просто недостаточно.
Не знаю про докер 1.6, но в 1.8 МОЖНО добавить дополнительное крепление к докер-машине
Добавление точки подключения виртуальной машины (часть 1)
CLI : (работает только когда машина остановлена)
VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automount
Таким образом, пример в окнах будет
GUI : (НЕ требует остановки машины)
<machine name>
(по умолчанию)<host dir>
(e :)<mount name>
(e)Монтирование в boot2docker (часть 2)
Смонтировать вручную в boot2docker :
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 :
Пока авторизовался в машине
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1 может быть другим для вас ...Добавить
С этими изменениями у вас должна быть новая точка монтирования. Это один из немногих файлов, который я смог найти, который вызывается при загрузке и является постоянным. Пока не будет лучшего решения, это должно сработать.
Старый метод: реже рекомендуется , но оставлен как альтернатива
/mnt/sda1/var/lib/boot2docker/profile
, sda1 может быть другим для вас ...Добавить
В крайнем случае , вы можете выбрать более утомительную альтернативу и просто изменить загрузочный образ.
git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
cd boot2docker
git -c core.autocrlf=false checkout v1.8.1
# или ваша соответствующая версияrootfs/etc/rc.d/automount-shares
Добавьте
try_mount_share <local_dir> <mount_name>
строку прямо перед fi в конце. НапримерТолько убедитесь, что не устанавливаете ничего, что нужно операционной системе, например / bin и т. Д.
docker build -t boot2docker .
# В первый раз это займет около часа :(docker run --rm boot2docker > boot2docker.iso
Это действительно работает, это просто долго и сложно
докер версия 1.8.1, докер-машина версия 0.4.0
источник
/mnt/sda1/var/lib/boot2docker/profile
, можете ли вы объяснить, почему вы перешли на использование/mnt/sda1/var/lib/boot2docker/bootlocal.sh
? Кроме того, выделение такого большого количества текста не способствует удобочитаемости вашего ответа ;-)bootlocal.sh
метод. Все, что я могу сказать, это выглядит проще, если просто использовать команду монтирования, как это сделал я,bootlocal.sh
чем в профиле. Кроме того, обычно я считаю, чтоprofile
его можно запускать несколько раз, а монтирование нужно запускать только один раз, поэтому это имеет больше смысла. Но оба могут работать.Также столкнулся с этой проблемой, и похоже, что локальные тома не монтируются при использовании докер-машины. Хакерское решение -
получить текущий рабочий каталог экземпляра докер-машины
docker-machine ssh <name> pwd
используйте инструмент командной строки, например,
rsync
скопируйте папку в удаленную системуПо умолчанию pwd - / root, поэтому приведенная выше команда будет
rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root
NB: вам нужно будет указать пароль для удаленной системы. Вы можете быстро создать его с помощью ssh в удаленной системе и создать пароль.
измените точку монтирования тома в вашем
docker-compose.yml
файле с.:/app
на/root/<name_of_folder>:/app
бегать
docker-compose up -d
NB, когда изменения вносятся локально, не забудьте перезапустить,
rsync
чтобы отправить изменения в удаленную систему.Это не идеально, но работает. Проблема не решена https://github.com/docker/machine/issues/179
Другой проект, который пытается решить эту проблему, включает docker-rsync
источник
exit status 255
приходится полностью воссоздавать машину.docker 1.10
иdocker-machine 0.6.0
gist.github.com/cristobal/fcb0987871d7e1f7449eНа данный момент я не вижу способа монтировать тома на машинах, поэтому подход к настоящему моменту заключался бы в том, чтобы как-то скопировать или синхронизировать файлы, которые вам нужны, на машине.
Есть разговоры о том , как решить эту проблему на GitHub репо докер-машины. Кто-то сделал запрос на перенос, реализующий scp на докер-машине, и он уже объединен на master, поэтому очень вероятно, что следующий выпуск будет включать его.
Поскольку он еще не выпущен, я бы порекомендовал, если у вас есть код, размещенный на github, просто клонируйте свое репо, прежде чем запускать приложение.
Обновление: глядя дальше, я обнаружил, что эта функция уже доступна в последних двоичных файлах , когда вы их получите, вы сможете скопировать свой локальный проект, выполнив команду, подобную этой:
Это общая форма:
Таким образом, вы можете копировать файлы с компьютеров и на них.
Ура! 1
источник
С октября 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
источник
...:<guest-path> <host-path>
(а не наоборот). Что-то такое простое и важное, что нужно отметить в документации ... просто нет!Если вы выберете опцию rsync с docker-machine, вы можете комбинировать ее с
docker-machine ssh <machinename>
командой следующим образом: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
( http://linuxcommand.org/man_pages/rsync1.html )
источник
Наконец выяснилось, как обновить Windows Docker Toolbox до версии v1.12.5 и сохранить работу моих томов, добавив общую папку в
Oracle VM VirtualBox
диспетчере и отключив преобразование пути. Если у вас Windows 10+, вам лучше использовать новую версию Docker для Windows.1-е обновление Боль:
Пример базы данных Redis:
redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"
В терминале быстрого запуска Docker ....
docker-machine stop default
- Убедитесь, что виртуальная машина подключенаВ Oracle VM VirtualBox Manager ...
default
ВМ через или командную строкуD:\Projects\MyProject\db
=>/var/db
В
docker-compose.yml
..."/var/db/redis:/data:rw"
В терминале быстрого запуска Docker ....
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).Оригинальный выпуск
К вашему сведению ... Вот исходная ошибка, которую я получил, когда использовал хорошие чистые относительные пути, которые раньше отлично работали для старых версий. Мое отображение объема раньше было просто
"./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
чтобы остановить эту чушь.Я рекомендую задокументировать ваше дополнительное сопоставление общих папок виртуальной машины в вашем
docker-compose.yml
файле, поскольку вам может потребоваться снова удалить VirtualBox и сбросить общую папку, и в любом случае ваши коллеги-разработчики полюбят вас за это.источник
Все остальные ответы были хорошими для того времени, но теперь (Docker Toolbox v18.09.3) все работает из коробки. Вам просто нужно добавить общую папку в VirtualBox VM.
Docker Toolbox автоматически добавляется в
C:\Users
качестве общей папки на/c/Users
виртуальной машине Linux (с использованием функции общих папок Virtual Box), поэтому, если вашdocker-compose.yml
файл находится где-то по этому пути, и вы подключаете каталоги хост-машины только по этому пути - все должно работать из коробки.Например:
C:\Users\username\my-project\docker-compose.yml
:.
Путь будет автоматически преобразован в абсолютный путь ,C:\Users\username\my-project
а затем/c/Users/username/my-project
. И именно так этот путь видится с точки зрения виртуальной машины linux (вы можете проверить:docker-machine ssh
а затемls /c/Users/username/my-project
). Итак, финальное крепление будет/c/Users/username/my-project:/app
.У вас все работает прозрачно.
Но это не сработает, если путь монтирования вашего хоста не находится под
C:\Users
путем. Например, если вы поместите то же самоеdocker-compose.yml
подD:\dev\my-project
.Однако это можно легко исправить.
docker-machine stop
).Откройте графический интерфейс Virtual Box, откройте настройки виртуальной машины с именем
default
, откройтеShared Folders
раздел и добавьте новую общую папку:D:\dev
d/dev
OK
Дважды нажмите и закройте графический интерфейс Virtual Box.docker-machine start
).Вот и все. Все пути к хост-машине
D:\dev
теперь должны работать вdocker-compose.yml
монтировках.источник
Это может быть сделано сочетанием ведьмы из трех инструментов:
docker-machine mount
,rsync
,inotifywait
Допустим, у вас есть
docker-compose.yml
иrun_web.sh
в/home/jdcaballerov/web
docker-machine machine:/home/jdcaballerov/web /tmp/some_random_dir
rsync -r /home/jdcaballerov/web /tmp/some_random_dir
Синхронизируйте каждое изменение файлов в вашем каталоге:
БУДЬТЕ ВНИМАТЕЛЬНЫ - есть два каталога с одинаковым путем: один находится на вашем локальном (главном) компьютере, а второй - на докере.
источник
Я предполагаю, что
run_web.sh
файл находится в том же каталоге, что и вашdocker-compose.yml
файл. Тогда команда должна бытьcommand: /app/run_web.sh
.Если
Dockerfile
(что вы не раскрываете) позаботится о помещенииrun_web.sh
файла в образ Docker.источник
После обобщения сообщений здесь прилагается обновленный скрипт для создания дополнительной точки подключения хоста и автоматического монтирования при перезапуске Virtualbox. Краткое описание рабочей среды, как показано ниже: - Windows 7 - docker-machine.exe версия 0.7.0 - VirtualBox 5.0.22
источник
Я использую докер-машину 0.12.2 с диском виртуального бокса на моем локальном компьютере. Я обнаружил, что есть каталог,
/hosthome/$(user name)
из которого у вас есть доступ к локальным файлам.источник
Просто подумал, что упомянул, что использую 18.03.1-ce-win65 (17513) в Windows 10, и я заметил, что если вы ранее использовали общий диск и кешировали учетные данные, после смены пароля в докере появится тома, смонтированные внутри контейнеров, как пустые.
Это не указывает на то, что на самом деле происходит то, что теперь не удается получить доступ к общему ресурсу со старыми кэшированными учетными данными. Решение в этом сценарии состоит в том, чтобы сбросить учетные данные либо через пользовательский интерфейс (Настройки-> Общие диски), либо отключить совместное использование рендерируемого диска и ввести новый пароль.
Было бы полезно, если бы docker-compose выдавал ошибку в этих ситуациях.
источник