Docker makinesine yerel birimler nasıl eklenir


86

Docker-machine ile docker-compose kullanmaya çalışıyorum. Docker-compose.yml dosyası aşağıdaki gibi tanımlara sahiptir:

web:
  build: .
  command: ./run_web.sh
  volumes:
    - .:/app
  ports:
    - "8000:8000"
  links:
    - db:db
    - rabbitmq:rabbit
    - redis:redis

Çalıştırırken docker-compose up -dher şey komutu yürütmeye çalışırken kadar gider ve bir hata üretilir:

Kapsayıcı başlatılamıyor b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d: [8] Sistem hatası: exec: "./run_web.sh": stat ./run_web.sh: böyle bir dosya veya dizin yok

Uzak makineye yerel birimler bağlı değil. Yerel birimleri web uygulamalarının koduyla bağlamak için önerilen strateji nedir?


Projenin yapısı ve docker-compose.yml bu eğiticiye benzer syncano.com/…
jdcaballerov

1
Bu, docker-compose belgelerinde, yerel olarak compose kullanmaya başlayanlar için yararlı bir ipucu olmalıdır. Dosya yolumun neden yanlış olduğunu veya bulunamadığını anlamaya çalışırken saatlerimi WTF anlarından kurtarırdı. Hayır sadece aptal hissediyorum.
timbrown

Yanıtlar:


93

Docker-machine, kullanıcılar dizinini otomatik olarak bağlar ... Ancak bazen bu yeterli değildir.

Ben docker 1.6 bilmem ama 1.8 size CAN liman işçisi-makineye monte ek eklemek

Sanal Makine Montaj Noktası Ekleyin (bölüm 1)

CLI : (Yalnızca makine durdurulduğunda çalışır)

VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automount

Yani pencerelerde bir örnek

/c/Program\ Files/Oracle/VirtualBox/VBoxManage.exe sharedfolder add default --name e --hostpath 'e:\' --automount

GUI : (makinenin durdurulmasını GEREKMEZ)

  1. "Oracle VM VirtualBox Manager" ı başlatın
  2. Sağ Tıklama <machine name>(varsayılan)
  3. Ayarlar ...
  4. Paylaşılan Klasörler
  5. Sağdaki Klasör + Simge (Paylaşım Ekle)
  6. Klasör Yolu: <host dir>(e :)
  7. Klasör Adı: <mount name>(e)
  8. "Otomatik bağlama" ve "Kalıcı Yap" seçeneğini işaretleyin (İsterseniz yalnızca okuyun ...) (Otomatik bağlama şu anda anlamsız ...)

Boot2docker'a montaj (bölüm 2)

Boot2docker'da manuel olarak monte edin :

  1. Oturum açmanın çeşitli yolları vardır, "Oracle VM VirtualBox Manager" içinde "Göster" veya IP adresine göre docker'a ssh / putty docker-machine ip defaultvb.
  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>

Ancak bu yalnızca makineyi yeniden başlatana kadar iyidir ve ardından bağlantı kaybolur ...

Boot2docker'a bir otomatik bağlantı eklemek :

Makinede oturum açtığınızda

  1. Düzenle / oluştur (kök olarak) /mnt/sda1/var/lib/boot2docker/bootlocal.sh, sda1 sizin için farklı olabilir ...
  2. Ekle

    mkdir -p <local_dir>
    mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
    

Bu değişikliklerle yeni bir bağlama noktasına sahip olmalısınız. Bu, önyüklemede çağrılan ve kalıcı olan bulabildiğim birkaç dosyadan biri. Daha iyi bir çözüm bulunana kadar bu işe yaramalı.


Eski yöntem: Daha az tavsiye edilir , ancak alternatif olarak bırakılır

  • Edit (root olarak) /mnt/sda1/var/lib/boot2docker/profile, sda1 sizin için farklı olabilir ...
  • Ekle

    add_mount() {
      if ! grep -q "try_mount_share $1 $2" /etc/rc.d/automount-shares ; then
        echo "try_mount_share $1 $2" >> /etc/rc.d/automount-shares
      fi
    }
    
    add_mount <local dir> <mount name>
    

Bir itibariyle son çare , biraz daha sıkıcı bir alternatif alabilir ve sadece önyükleme görüntüsünü değiştirebilir.

  • git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
  • cd boot2docker
  • git -c core.autocrlf=false checkout v1.8.1 # veya uygun sürümünüz
  • Düzenle rootfs/etc/rc.d/automount-shares
  • try_mount_share <local_dir> <mount_name>Sonunda fi'den hemen önce satır ekleyin . Örneğin

    try_mount_share /e e
    

    İşletim sisteminin ihtiyaç duyduğu / bin vb. Gibi hiçbir şeye ayarlamadığınızdan emin olun.

  • docker build -t boot2docker . # Bu ilk seferde yaklaşık bir saat sürecektir :(
  • docker run --rm boot2docker > boot2docker.iso
  • Eski boot2docker.iso'yu yedekleyin ve yenisini ~ / .docker / machine / machines / dizinine kopyalayın.

Bu işe yarıyor, sadece uzun ve karmaşık

docker sürüm 1.8.1, docker-machine version 0.4.0


Bununla ilgili sorunları olan herkes için, yerel yolları docker makinesindekilere uydurmam gerektiğinden oldukça eminim. Ayrıca docker-compose, birimleri bağlamada başarılı görünüyordu, ancak normal docker - neden olduğundan emin değil.
spieden

3
Burada bahsedilen çözüm için bir komut dosyası oluşturuldu. En son docker 1.10 ve docker-machine 0.6.0 gist.github.com/cristobal/fcb0987871d7e1f7449e
cristobal

Farklı kaynaklar kullanımdan bahsediyor /mnt/sda1/var/lib/boot2docker/profile, neden kullanmaya geçtiğinizi açıklayabilir misiniz /mnt/sda1/var/lib/boot2docker/bootlocal.sh? Ayrıca, bu kadar metnin üzerinden geçmek cevabınızın okunabilirliğine katkıda bulunmaz ;-)
Forage

1
@ Forage Point benim biçimlendirmem hakkında alınmış :) Artık neden bu bootlocal.shyöntemi önerdiğimi hatırlamıyorum . Söyleyebileceğim tek şey, benim yaptığım gibi bir mount komutunu kullanmak bootlocal.shprofilde olduğundan daha temiz görünüyor . Ayrıca, tipik olarak, profilebirden çok kez çalıştırılabileceğine ve bir bineğin yalnızca bir kez çalıştırılması gerektiğine inanıyorum , bu yüzden daha mantıklı. Ama ikisi de işe yarayabilir.
Andy

SEVDİM! Teşekkür ederim!
Qorbani

28

Ayrıca bu sorunla karşılaştım ve docker-machine kullanılırken yerel birimler bağlanmamış gibi görünüyor. Bir hack çözümü,

  1. docker-machine örneğinin geçerli çalışma dizinini alın docker-machine ssh <name> pwd

  2. rsyncklasörü uzak sisteme kopyalamak gibi bir komut satırı aracı kullanın

    rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:<result _of_pwd_from_1>.
    

Varsayılan pwd / root olduğundan yukarıdaki komut şu şekilde olacaktır: rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root

NB: uzaktaki sistem için şifre sağlamanız gerekir. Uzak sistemde ssh ile hızlı bir şekilde bir tane oluşturabilir ve bir şifre oluşturabilirsiniz.

  1. docker-compose.ymldosyanızdaki birim bağlama noktasını yerine olarak .:/appdeğiştirin/root/<name_of_folder>:/app

  2. Çalıştırmak docker-compose up -d

Not: Değişiklikler yerel olarak yapıldığında rsync, değişiklikleri uzaktaki sisteme göndermek için yeniden çalıştırmayı unutmayın .

Mükemmel değil ama işe yarıyor. Devam eden bir sorun https://github.com/docker/machine/issues/179

Bunu çözmeye çalışan diğer proje docker-rsync içerir


rsync'in uzak sisteme yüklenmesi gerekiyor, görünen "sh: rsync: bulunamadı rsync: bağlantı beklenmedik şekilde kapatıldı (şu ana kadar 0 bayt alındı) [gönderen] rsync hatası: / SourceCache / rsync / rsync konumunda uzak komut bulunamadı (kod 127) -45 / rsync / io.c (453) [gönderen = 2.6.9] `Bunu nasıl çalıştırdınız?
krinker

1
rsync'in yerel sisteminize yüklenmesi gerekiyor
gbozee

Bu adımları kullanmak digitalocean ana makinemi tamamen kilitliyor .. Dosyalar çok iyi aktarılıyor, ancak ana makineye docker-machine ile yeniden bağlanmaya çalıştığımda exit status 255, makineyi tamamen yeniden oluşturmam gerekiyor.
dsifford

1
Burada bahsedilen çözüm için bir komut dosyası oluşturuldu. En son docker 1.10ve docker-machine 0.6.0 gist.github.com/cristobal/fcb0987871d7e1f7449e
cristobal

@cristobal, rsync çözümünü değil, bağlama çözümünü komut dosyası oluşturmuşsunuz gibi görünüyor?
Andy

14

Şu anda birimleri makinelere bağlamanın herhangi bir yolunu gerçekten göremiyorum, bu nedenle şimdiye kadarki yaklaşım, ihtiyacınız olan dosyaları makineye bir şekilde kopyalamak veya senkronize etmek olacaktır.

Orada konuşmaları liman işçisi-Makinenin github repo bu sorunu çözmek için nasıl. Birisi docker-machine üzerinde scp uygulayarak bir çekme isteği yaptı ve bu zaten master üzerinde birleştirildi, bu yüzden bir sonraki sürümde onu içermesi çok muhtemel.

Henüz yayınlanmadığından, şimdiye kadar kodunuzu github'da barındırıyorsanız, uygulamayı çalıştırmadan önce deponuzu kopyalamanızı tavsiye ederim.

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

Güncelleme: Daha ileriye baktığımda, özelliğin en son ikili dosyalarda zaten mevcut olduğunu buldum, bunları aldığınızda yerel projenizi aşağıdaki gibi bir komutu çalıştırarak kopyalayabileceksiniz:

docker-machine scp -r . dev:/home/docker/project

Genel biçim bu olmak:

docker-machine scp [machine:][path] [machine:][path]

Böylece dosyaları makinelerden ve makinelerin arasında kopyalayabilirsiniz.

Şerefe! 1



2
bu yöntem çok yavaş :(
Sergej Jevsejev

5

Ekim 2017'den beri, docker-machine için hile yapan yeni bir komut var, ancak çalıştırmadan önce dizinde hiçbir şey olmadığından emin olun, aksi takdirde kaybolabilir:

docker-machine mount <machine-name>:<guest-path> <host-path>

Daha fazla bilgi için belgeleri kontrol edin: https://docs.docker.com/machine/reference/mount/

Değişiklik ile Halkla İlişkiler: https://github.com/docker/machine/pull/4018


1
İnanılmaz bir şekilde, Docker Machine belgelerinden (bağladığınız), komuttaki sıranın ...:<guest-path> <host-path>( tam tersi değil) olduğunu bilmek - kelimenin tam anlamıyla - imkansızdır . Belgelerde not edilmesi kadar basit ve kritik bir şey ... sadece değil!
Dan Nissenbaum

Sanırım çok açık değil, haklısın. Komut listesinden tahmin edilmesi gerekiyor
Jorge

Hile yapıyor, ama başka bir şekilde. Docker-machine dizinini yerel makinenize bağlamanıza izin verir. Maalesef başka bir yola izin vermiyor :(
ravenwing

4

Docker-machine ile rsync seçeneğini seçerseniz, aşağıdaki docker-machine ssh <machinename>gibi komutla birleştirebilirsiniz :

rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<host_directory_to_sync_to>

Bu rsync komut formatını HOSTboş bırakarak kullanır :

rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

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


1

Sonunda, Windows Docker Toolbox'ı v1.12.5'e nasıl yükselteceğimi ve Oracle VM VirtualBoxyöneticiye paylaşılan bir klasör ekleyerek ve yol dönüşümünü devre dışı bırakarak birimlerimin çalışmasını nasıl sürdüreceğimi anladım . Windows 10+ kullanıyorsanız, Windows için yeni Docker'ı kullanmanız en iyisidir.

1. yükseltme Ağrısı:

  1. Önce VirtualBox'ı kaldırın.
    • Evet, bu Android Studio gibi diğer araçlarda bazı şeyleri bozabilir. Teşekkürler Docker :(
  2. Docker Toolbox'ın yeni sürümünü yükleyin.

Redis Veritabanı Örneği: redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"

Docker Hızlı Başlangıç ​​Terminalinde ....

  1. çalıştır docker-machine stop default- Sanal makinenin taşındığından emin olun

Oracle VM VirtualBox Manager'da ...

  1. defaultVeya komut satırı aracılığıyla sanal makineye paylaşılan bir klasör eklendi
    • D:\Projects\MyProject\db => /var/db

İçinde docker-compose.yml...

  1. Redis hacmi şu şekilde eşlendi: "/var/db/redis:/data:rw"

Docker Hızlı Başlangıç ​​Terminalinde ....

  1. Ayarlayın COMPOSE_CONVERT_WINDOWS_PATHS=0(Toolbox sürümü için> = 1.9.0)
  2. docker-machine start defaultVM'yi yeniden başlatmak için çalıştırın .
  3. cd D:\Projects\MyProject\
  4. docker-compose up şimdi çalışmalı.

Şimdi redis veritabanı oluşturuyor D:\Projects\MyProject\db\redis\dump.rdb

Göreceli ana bilgisayar yollarından neden kaçınılmalı?

Ben göreli konak yolları kaçınılması geçersiz '\' karakter taşıyabilirler Windows Toolbox için. Göreceli yolları kullanmak kadar güzel değil docker-compose.ymlama en azından benim geliştiricilerim proje klasörleri başka bir yerde olsa bile docker-compose.ymldosyayı kesmek zorunda kalmadan (SCM için kötü) bunu kolayca yapabilirler .

Orijinal Sayı

Bilginize ... İşte eski sürümler için gayet iyi çalışan güzel, temiz göreli yollar kullandığımda aldığım orijinal hata. Hacim eşlemem eskiden sadece"./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

Bu iki nedenden dolayı kırılıyor ..

  1. D:Sürücüye erişemiyor
  2. Birim yolları \karakter içeremez
    • docker-compose onları ekler ve bunun için sizi suçlar !!
    • COMPOSE_CONVERT_WINDOWS_PATHS=0Bu saçmalığı durdurmak için kullanın .

docker-compose.ymlVirtualBox'ı tekrar kaldırmanız ve paylaşılan klasörü sıfırlamanız gerekebileceğinden , ek VM paylaşımlı klasör eşlemenizi dosyanızda belgelemenizi tavsiye ederim ve yine de arkadaşlarınız sizi bunun için sevecek.


siz efendim, iyi birisiniz
AaronHS

1

Diğer tüm yanıtlar o zaman için iyiydi ama şimdi (Docker Toolbox v18.09.3) her şey kutudan çıktı. VirtualBox VM'ye paylaşılan bir klasör eklemeniz yeterlidir.

Docker Toolbox , sanal linux makinesinin altına (Virtual Box paylaşımlı klasörler özelliğini kullanarak) otomatik C:\Usersolarak paylaşılan klasör olarak ekler ; /c/Usersbu nedenle, docker-compose.ymldosyanız bu yolun altında bir yerde bulunuyorsa ve ana makinenin dizinlerini yalnızca bu yol altında bağlarsanız - hepsi kutudan çıktığı gibi çalışmalıdır.

Örneğin:

C:\Users\username\my-project\docker-compose.yml:

...
  volumes:
    - .:/app
...

.Yolu otomatik mutlak yol dönüştürülür C:\Users\username\my-projectsonra ve /c/Users/username/my-project. Linux sanal makinesi açısından bu yol tam olarak böyle görülüyor (kontrol edebilirsiniz: docker-machine sshve sonra ls /c/Users/username/my-project). Yani, son montaj olacak /c/Users/username/my-project:/app.

Hepsi şeffaf bir şekilde sizin için çalışıyor.

Ancak, ana bilgisayar bağlama yolunuz yolda değilse bu işe yaramaz C:\Users. Örneğin, aynısını docker-compose.ymlaltına koyarsanız D:\dev\my-project.

Yine de bu kolayca düzeltilebilir.

  1. Sanal makineyi ( docker-machine stop) durdurun .
  2. Virtual Box GUI'sini açın, Adlandırılmış Virtual Machine Ayarlarını defaultaçın, Shared Foldersbölümü açın ve yeni paylaşılan klasörü ekleyin:

    • Klasör yolu: D:\dev
    • Klasör ismi: d/dev

    OKİki kez basın ve Virtual Box GUI'yi kapatın.

  3. Sanal makineyi ( docker-machine start) başlatın .

Bu kadar. Altındaki ana makinenin tüm yolları D:\devartık docker-compose.ymlbağlarda çalışmalıdır .


1

Üç araçlar bitti cadı kombinasyonu olabilir: docker-machine mount, rsync,inotifywait

TL; DR

Aşağıdakilerin tümüne dayalı komut dosyası burada

Let Diyelim ki sizin söylüyorlar docker-compose.ymlve run_web.shde/home/jdcaballerov/web

  1. Dizini ana makinenizde olduğu gibi aynı yola sahip makineye bağlayındocker-machine machine:/home/jdcaballerov/web /tmp/some_random_dir
  2. Bağlı dizini ana makinenizdeki dir ile senkronize edin rsync -r /home/jdcaballerov/web /tmp/some_random_dir
  3. Dizininizdeki her dosya değişikliğinde senkronize edin:

    inotifywait -r -m -e close_write --format '%w%f' /home/jdcaballerov/web | while read CHANGED_FILE
    do
        rsync /home/jdcaballerov/web /tmp/some_random_dir
    done
    

FARKINDA OLUN - aynı yola sahip iki dizin vardır - biri yerel (ana bilgisayar) makinenizde, ikincisi docker makinesinde.


0

run_web.shDosyanın dosyanızla aynı dizinde olduğunu varsayıyorum docker-compose.yml. O zaman komut olmalıdır command: /app/run_web.sh.

Dockerfile(İfşa etmediğiniz) run_web.shdosyayı Docker görüntüsüne koymadığınız sürece .


Cevabınız için teşekkürler. Aynı dizinde. Ancak birimin takılmadığını fark ettim. Dosyalar mevcut değil ve soru bu. Nasıl eklenir? Yapı syncano.com/… '
jdcaballerov

Hem docker hem de dicker-compose'un en son sürümlerine sahip olduğunuzdan emin olun.
Thomasleveil

docker: Docker sürüm 1.6.0, derleme 4749651, docker-machine version 0.2.0 (8b9eaf2), docker-compose 1.2.0
jdcaballerov

Dockerfile'ı syncano.com/… adresinden herhangi bir şekilde değiştirdiniz mi?
Thomasleveil

1
Evet, kodu ekliyorum, dizini oluşturuyorum. Sorun şu ki, docker-compose çalıştırıldığında birimin üzerine yazması: ciltler: -.: / App ve boş bir dizin bırakması. Compose'daki ciltleri yorumladım ve işe yarıyor.
jdcaballerov

0

Gönderileri burada özetledikten sonra, ek ana bilgisayar bağlama noktası oluşturmak ve Virtualbox yeniden başlatıldığında otomatik olarak bağlanmak için güncellenmiş komut dosyası ekleyin. Aşağıdaki çalışma ortamı özeti: - Windows 7 - docker-machine.exe sürüm 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'

0

Yerel makinemde sanal kutu sürücüsü ile docker-machine 0.12.2 kullanıyorum. /hosthome/$(user name)Yerel dosyalara erişiminizin olduğu bir dizin olduğunu buldum .


0

Windows 10'da 18.03.1-ce-win65 (17513) kullandığımı söylemeyi düşündüm ve daha önce bir sürücü paylaştıysanız ve kimlik bilgilerini önbelleğe aldıysanız, parolanızı değiştirdiğinizde docker'ın kullanmaya başlayacağını fark ettim. konteynerlerin içine boş olarak monte edilen hacimler.

Gerçekte olanın şu anda eski önbelleğe alınmış kimlik bilgileriyle paylaşılana erişemediğine dair hiçbir gösterge vermiyor. Bu senaryodaki çözüm, kimlik bilgilerini kullanıcı arabirimi (Ayarlar-> Paylaşılan sürücüler) aracılığıyla sıfırlamak veya sürücü paylaşımını devre dışı bırakıp ardından yeniden etkinleştirip yeni parolayı girmektir.

Bu durumlarda docker-compose bir hata verirse faydalı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.