Как монтировать локальные Тома в 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?

920   11  

11 ответов:

также столкнулся с этой проблемой, и похоже, что локальные Тома не монтируются при использовании docker-machine. Хак решение является

  1. получить текущий рабочий каталог экземпляра docker-machine docker-machine ssh <name> pwd

  2. использовать инструмент командной строки, как 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 в удаленной системе и создать пароль.

  1. измените точку монтирования громкости в вашем С .:/app до /root/<name_of_folder>:/app

  2. выполнить 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: (не требует остановки машины)

  1. запустите "Oracle VM VirtualBox Manager"
  2. Щелкните Правой Кнопкой Мыши <machine name> (по умолчанию)
  3. настройки...
  4. Общие Папки
  5. папка+ значок справа (добавить долю)
  6. Путь К Папке: <host dir> (e:)
  7. Папки Имя: <mount name> (e)
  8. Проверьте "автоматическое крепление" и "сделать постоянным" (читать только если вы хотите...) (Автоматическое крепление вроде бессмысленно в настоящий момент...)

установка в boot2docker (часть 2)

монтировать вручную в boot2docker:

  1. есть различные способы войти в систему, использовать "Show" в "Oracle VM VirtualBox Manager" или ssh/putty в docker по IP-адресу docker-machine ip default и т. д...
  2. sudo mkdir -p <local_dir>
  3. sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>

но это только хорошо, пока вы не перезагрузите машину, а затем крепление потерянный...

добавление автомонтажа в boot2docker:

при входе в машину

  1. изменить/создать (как root) /mnt/sda1/var/lib/boot2docker/bootlocal.sh, sda1 может отличаться для вас...
  2. добавить

    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

(http://linuxcommand.org/man_pages/rsync1.html)

С октября 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-я боль обновления:

  1. Сначала удалите VirtualBox.
    • Да, что может сломать вещи в других инструментах, таких как Android Studio. Спасибо Докер : (
  2. Установите новую версию Docker Toolbox.

Redis Пример Базы Данных: redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"

В Терминале Быстрого Запуска Docker ....

  1. выполнить docker-machine stop default - убедитесь, что VM перевозится

в Oracle VM VirtualBox Manager ...

  1. добавлена общая папка в default VM через или командной строки
    • D:\Projects\MyProject\db => /var/db

на docker-compose.yml...

  1. сопоставленный объем redis как:"/var/db/redis:/data:rw"

В Терминале Быстрого Запуска Docker ....

  1. Set COMPOSE_CONVERT_WINDOWS_PATHS=0 (для версии Toolbox >= 1.9.0)
  2. выполнить docker-machine start default для перезапуска виртуальной машины.
  3. cd D:\Projects\MyProject\
  4. 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

происходит это по двум причинам ..

  1. он не может получить доступ к D: диск
  2. пути Тома не могут включать \ символы
    • 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 дал ошибку в этих ситуациях.

Это, кажется, работает для меня

volumes: - $PWD/drupal-prod-files:/drupal-prod-files

    Ничего не найдено.

Добавить ответ:
Отменить.