Cara memasang direktori host di wadah Docker

618

Saya mencoba memasang direktori host ke wadah Docker sehingga setiap pembaruan yang dilakukan pada host tercermin ke dalam wadah Docker.

Di mana saya melakukan sesuatu yang salah. Inilah yang saya lakukan:

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

  • Saya tidak tahu cara memeriksa versi boot2docker

Pertanyaan, masalah yang dihadapi:

  1. Bagaimana saya harus menautkan main_folder ke folder test_container yang ada di dalam wadah buruh pelabuhan?
  2. Saya perlu membuat ini secara otomatis. Bagaimana saya melakukannya tanpa benar-benar menggunakan run -d -vperintah?
  3. Apa yang terjadi jika boot2docker lumpuh? Di mana file Docker disimpan (selain dari Dockerfile)?
Kishore Vaishnav
sumber
2
FYI, ini sepertinya sudah diperbaiki di docker pada komentar ini. Saya menggunakan boot2docker di mac saya. Saya dapat menggunakan opsi -v dan direktori lokal saya dipasang ke wadah.
Marco

Jawaban:

509

Ada beberapa cara Anda bisa melakukan ini. Cara paling sederhana untuk melakukannya adalah dengan menggunakan ADDperintah dockerfile seperti:

ADD . /path/inside/docker/container

Namun, setiap perubahan yang dilakukan pada direktori ini pada host setelah membangun dockerfile tidak akan muncul dalam wadah. Ini karena ketika membangun sebuah wadah, buruh pelabuhan memadatkan direktori ke dalam .tardan mengunggah konteks itu ke dalam wadah secara permanen.

Cara kedua untuk melakukan ini adalah cara Anda mencoba, yaitu memasang volume. Karena mencoba menjadi portabel mungkin, Anda tidak dapat memetakan direktori host ke direktori kontainer buruh pelabuhan dalam buruh pelabuhan, karena direktori host dapat berubah tergantung pada mesin yang Anda jalankan. Untuk memetakan direktori host ke direktori kontainer buruh pelabuhan, Anda perlu menggunakan -vbendera saat menggunakan buruh pelabuhan jalankan seperti ini:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run
nhjk
sumber
Saya mencoba seperti ini $ kishore $ docker -v / Pengguna / kishore / main_folder: / test_container Docker versi 0.9.1, membangun $ 867b2a9 kishore $ docker run -v / Pengguna / kishore / main_folder: / test_container Penggunaan: docker run [OPSI] IMAGE [GAMBAR] PERINTAH] [ARG ...] Jalankan perintah dalam wadah baru -P, --publish-all = false: Publikasikan semua port yang terbuka ke antarmuka host -a, --attach = []: Lampirkan ke stdin, stdout atau stderr. -c, --cpu-shares = 0: CPU share (bobot relatif)
Kishore Vaishnav
2
dapatkah Anda memiliki keduanya ADD. dan -v volume me-mount pada saat yang sama. menggunakan app_dir default jika tidak menentukan host host?
alexzg
@ alexzg Saya tidak berpikir kita hanya bisa yang pertama diutamakan. Juga, saya tidak jelas tentang app_dir titik 2 default Anda ... host mount ..?
Kishore Vaishnav
35
Ini bekerja untuk saya di mac os x dengan docker-machine dan VirtualBox. Satu peringatan yang saya temukan dengan coba-coba adalah bahwa direktori host harus berupa path lengkap dan bukan path relatif.
jbustamovej
25
ADDsebenarnya tidak "me-mount" itu menyalin file ke dalam wadah bertahan di dalamnya.
kev
200

Pengguna pertanyaan ini menggunakan Docker version 0.9.1, build 867b2a9, saya akan memberi Anda jawaban untuk versi buruh pelabuhan> = 17,06.

Apa yang Anda inginkan, menjaga direktori lokal disinkronkan dalam direktori kontainer, dilakukan dengan memasang volume dengan tipe bind. Ini akan mengikat direktori sumber (sistem Anda) dan target (pada wadah buruh pelabuhan). Ini hampir sama dengan memasang direktori di linux.

Menurut dokumentasi Docker , perintah yang tepat untuk memasang sekarang mountbukan -v. Berikut dokumentasinya:

  • --mount: Terdiri dari beberapa pasangan nilai kunci, dipisahkan dengan koma. Setiap pasangan kunci / nilai berbentuk <key>=<value>tuple. The --mountsintaks lebih verbose dari -vatau --volume, tetapi urutan tombol tidak signifikan, dan nilai bendera adalah lebih mudah untuk memahami.

  • The typedari gunung, yang dapat bind, volumeatau tmpfs. (Kita akan menggunakan bind )

  • The sourcedari mount. Untuk bind mounts, ini adalah path ke file atau direktori pada host daemon Docker. Dapat ditentukan sebagai sourceatau src.

  • The destinationmengambil sebagai nilainya jalan di mana file atau direktori akan dipasang dalam wadah. Dapat ditentukan sebagai destination, dst, atau target.

Jadi, untuk memasang direktori saat ini (sumber) dengan /test_container(target) kita akan menggunakan:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

Jika parameter mount ini memiliki spasi, Anda harus memberi tanda kutip di sekitarnya. Ketika saya tahu mereka tidak melakukannya, saya akan menggunakan `pwd`:

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

Anda juga harus berurusan dengan izin file, lihat artikel ini .

Eduardo Santana
sumber
2
Saya telah mengangkat jawaban Anda karena saya suka betapa ringkasnya dan tidak salah, tetapi Anda mungkin ingin memperbaruinya sedikit demi sedikit jawaban saya di stackoverflow.com/a/51829247/901899
rainabba
2
Saya kira dokumentasi telah diperbarui sejak jawaban ini, karena saat ini sepertinya merekomendasikan volume, daripada mount. Layak untuk pergi itu, sebelum melakukan apa pun.
Sipty
1
@Sipty mungkin merujuk pada yang berikut: " Jika Anda mengembangkan aplikasi Docker baru, pertimbangkan untuk menggunakan volume bernama . Anda tidak dapat menggunakan perintah Docker CLI untuk secara langsung mengelola bind mounts. "
Aluthren
81

2 mount berturut-turut: Saya kira banyak posting di sini mungkin menggunakan dua boot2docker, alasan Anda tidak melihat apa-apa adalah karena Anda memasang direktori dari boot2docker, bukan dari host Anda.

Anda pada dasarnya membutuhkan 2 mount berturut-turut:

yang pertama memasang direktori dari host Anda ke sistem Anda

yang kedua untuk memasang direktori baru dari boot2docker ke wadah Anda seperti ini:

  • 1) Pasang sistem lokal pada boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) Pasang boot2dockerfile pada wadah linux

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

Kemudian ketika Anda lsdi dalam containerfolderAnda akan melihat konten Anda hostfolder.

louis V
sumber
1
Jawaban Terbaik. Saya harus menambahkan bahwa (di bawah windows) hostfolder dalam perintah mount merujuk ke nama berbagi folder. Yang muncul dengan net shareperintah di dalam terminal windows (cmd). Dan Anda harus menambahkan itu sebagai folder bersama dengan GUI virtualBox (menggunakan nama yang sama jika Anda mengikuti logika saya). Jika Anda menghilangkan untuk membagikannya, itu akan berfungsi, tetapi Anda akan menghadapi masalah dengan izin dan menyegarkan kinerja.
Kir Kanos
bagaimana perintah mount mengetahui host di mana / boot2dockerfolder berada?
alfonsodev
Saya mendapat kesalahan mount: unknown filesystem type 'vboxsf'
:,
"vboxsf" adalah driver "file system" folder bersama VirtualBox. Itu harus dikonfigurasikan ke dalam VM dengan menginstal ekstensi VirtualBox. Gambar boot2docker tidak boleh sudah diinstal. VirtualBox memiliki fungsi "perangkat" untuk "menyisipkan" gambar ISO Tambahan VirtualBox sebagai volume virtual. Biasanya Anda dapat me-mount ini di mount dengan menggunakan mount / dev / cdrom / mnt, masuk ke / mnt dan menjalankan bash VBoxLinuxAdditions. Mungkin perlu instalasi gcc, kernel, atau dependensi lainnya.
Andrew Wolfe
mount.vboxsf: pemasangan gagal dengan kesalahan: Tidak ada file atau direktori seperti itu mount: pemasangan mymapfoldername on / boot2dockerfolder gagal: Tidak ada file atau direktori seperti itu
vee
71

Anda dapat menggunakan opsi -v dari cli, fasilitas ini tidak tersedia melalui Dockerfile

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

di mana host_dir adalah direktori dari host yang ingin Anda mount. Anda tidak perlu khawatir tentang direktori kontainer jika tidak ada buruh pelabuhan yang akan membuatnya.

Jika Anda melakukan perubahan pada host_dir dari mesin host (di bawah hak istimewa root) itu akan terlihat ke wadah dan sebaliknya.

rgaut
sumber
6
Apa contoh yang bagus, bersih, to-the-point untuk menggambarkan opsi mount host. Itu mungkin dapat ditingkatkan dengan menggunakan direktori nyata: di docker run -t -i -v /tmp:/tmp ubuntu /bin/bashmana host /tmpakan dipasang pada wadah /tmp. Sekarang satu dapat touch /tmp/hello-worlddari wadah dan melihat file muncul di host.
Stephan Henningsen
3
Bekerja dengan sempurna. Tetapi pemasangan dengan cara ini menetapkan pemilik direktori sebagai root dan ini juga mengharapkan kontainer untuk dijalankan sebagai root. Bagaimana cara memasang dir sebagai non-root saat wadah dijalankan sebagai non-root?
Arun
33

Apakah mungkin Anda menggunakan buruh pelabuhan pada OS X melalui boot2dockeratau sesuatu yang serupa.

Saya telah membuat pengalaman yang sama - perintahnya benar tetapi tidak ada (masuk akal) yang dipasang di wadah.

Ternyata - sudah dijelaskan dalam dokumentasi buruh pelabuhan . Ketika Anda mengetik docker run -v /var/logs/on/host:/var/logs/in/container ...maka /var/logs/on/hostsebenarnya dipetakan dari boot2dockerVM-image, bukan Mac Anda.

Anda harus mem-pipe folder bersama melalui VM Anda ke host aktual Anda (Mac dalam kasus saya).

pengguna3680997
sumber
1
Terima kasih! Ini membantu saya dengan masalah yang berkaitan jauh. Postgres yang berjalan di dalam Docker terikat ke IP VBox, bukan localhost, seperti yang akan terjadi jika tidak berjalan pada OS X.
Peter Becich
2
URL ke dokumentasi buruh pelabuhan itu tidak lagi valid
digitaldavenyc
haha lelucon terbaik yang pernah ... mereka benar-benar bisa membuat petunjuk atau lebih.
user2834172
2
Tautan dokumentasi Anda adalah 404
Factor Mystic
3
Saya ingin tahu melihat contoh pemipaan folder bersama melalui VM ke host yang sebenarnya.
Derek
28

[PEMBARUAN] Per ~ Juni 2017, Docker untuk Mac menangani semua bagian yang menjengkelkan ini tempat Anda harus mengotak-atik VirtualBox. Ini memungkinkan Anda memetakan segala sesuatu pada host lokal Anda menggunakan /privateawalan. Info lebih lanjut di sini . [/MEMPERBARUI]

Semua jawaban saat ini berbicara tentang Boot2docker. Karena sekarang sudah tidak digunakan lagi untuk mesin docker, ini bekerja untuk mesin docker:

Pertama, ssh ke docker-machine vm dan buat folder yang akan kami pemetaan untuk:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

Sekarang bagikan folder ke VirtualBox:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

Akhirnya, ssh ke docker-machine lagi dan pasang folder yang baru saja kita bagikan:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

Catatan: untuk UID dan GID Anda pada dasarnya dapat menggunakan bilangan bulat apa pun asalkan belum diambil.

Ini diuji pada docker-machine 0.4.1 dan docker 1.8.3 pada OS X El Capitan.

Eli
sumber
1
+1. Setelah beberapa jam membenturkan kepala, jawaban Anda berhasil. Ini harus menjadi bagian dari docker-machinedokumen.
Abhijit Sarkar
Mengapa tidak menggunakan -vbendera?
igracia
1
@igracia -vbendera tidak berfungsi seperti yang Anda harapkan di OS X (atau windows). Docker berjalan di VM sehingga folder direferensikan dalam -vpoin ke folder di VM, bukan di OS root. Teknik ini mengambil langkah selanjutnya memetakan folder VM kembali ke root OS.
Patrick Gunderson
1
@ PatrickGunderson Dalam kasus saya (OS X) folder berada di host, bukan di VM, dan berfungsi dengan baik. Docker Tolls mengurus ekspornya ke VM, dan dari sana ke kontainer.
igracia
1
Satu-satunya pengecualian pada aturan yang saya sebutkan adalah bahwa VM akan secara otomatis dipasang /Usersuntuk berbagi ke buruh pelabuhan. Itu berarti jika file kerja Anda masuk ~/*maka Anda baik untuk pergi. Jika Anda memiliki pengaturan lingkungan dev Anda untuk kehabisan /developmentatau apa pun selain /UsersAnda akan memiliki masalah docs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson
27

Saya hanya bereksperimen dengan menjalankan aplikasi SailsJS saya di dalam wadah Docker untuk menjaga mesin fisik saya tetap bersih.

Saya menggunakan perintah berikut untuk memasang aplikasi SailsJS / NodeJS saya di / app:

cd my_source_code_folder
run docker -it -p 1337: 1337 -v $ (pwd): / app my_docker / image_with_nodejs_etc
Sven
sumber
5
Bagaimana bisa melakukan ini di Dockerfile?
orad
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

Di sistem saya, saya sudah mengoreksi jawaban dari nhjk, ini berfungsi dengan sempurna ketika Anda menambahkan -tflag.

Ali
sumber
Apakah Anda dapat membuat / memperbarui file dari FS lokal dan melihat perubahan di dalam wadah buruh pelabuhan?
Avi Mehenwal
14

Jika host adalah windows 10 maka alih-alih maju slash, gunakan backward slash -

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

Pastikan drive host dibagi (C dalam kasus ini). Dalam kasus saya, saya mendapat prompt meminta izin berbagi setelah menjalankan perintah di atas.

Duke79
sumber
13

Di Mac OS, untuk memasang folder /Users/<name>/projects/di mac Anda di root wadah Anda:

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

ls /projects

bormat
sumber
11

Pembaruan Jul 2015 - boot2docker sekarang mendukung pemasangan langsung. Anda dapat menggunakan -v /var/logs/on/host:/var/logs/in/containerlangsung dari prompt Mac Anda, tanpa pemasangan ganda

Tal
sumber
11

Untuk pengguna Windows 10 , penting untuk memiliki titik mount di dalam C:/Users/direktori. Saya mencoba berjam-jam untuk membuatnya bekerja. Posting ini membantu tetapi pada awalnya tidak jelas karena solusi untuk Windows 10 adalah komentar untuk jawaban yang diterima. Beginilah cara saya melakukannya:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

Kemudian untuk mengujinya, Anda bisa melakukannya echo TEST > hostTest.txtdi dalam gambar Anda. Anda seharusnya dapat melihat file baru ini di folder host lokal di C:/Users/C/Desktop/dockerStorage/.

KF
sumber
Garis miring ganda di jalan itulah yang membuatnya bekerja untukku. Itu membingungkan karena saya menggunakan -v $(pwd):/var/xxdulu dan itu berhasil, tetapi menghasilkan direktori kosong. Saya menjalankan cyg via babun.
kenchilada
Punya masalah yang sama di Windows 7 saat menggunakan / c / data /, memindahkan direktori host di bawah / c / Users / <user> / menyelesaikannya untuk saya. Terima kasih.
user8675309
1
dapatkah kami memiliki tautan ke pos yang membantu Anda menyelesaikan masalah?
PBo
11

Saya pernah mengalami masalah yang sama. Baris perintah saya terlihat seperti ini:

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

Masalahnya dengan 'pwd'. Jadi saya mengubahnya menjadi $ (pwd):

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME
NikitQa
sumber
1
Untuk apa z?
hhh
2
Opsi z menunjukkan bahwa konten pemasangan bind dibagi di antara banyak wadah.
Jason
10

Pada Docker 18-CE, Anda dapat menggunakan docker run -v /src/path:/container/pathuntuk melakukan pengikatan 2-arah dari folder host.

Ada tangkapan besar di sini jika Anda bekerja dengan Windows 10 / WSL dan memiliki Docker-CE untuk Windows sebagai host Anda dan kemudian alat klien docker-ce di WSL. WSL tahu tentang seluruh / sistem file sementara host Windows Anda hanya tahu tentang drive Anda. Di dalam WSL, Anda dapat menggunakan / mnt / c / projectpath, tetapi jika Anda mencobanyadocker run -v ${PWD}:/projectpath , Anda akan menemukan di host bahwa / projectpath / kosong karena pada host / mnt tidak berarti apa-apa.

Jika Anda bekerja dari / c / projectpath dan MAKA lakukan docker run -v ${PWD}:/projectpathdan Anda AKAN menemukan bahwa dalam wadah, / projectpath akan mencerminkan / c / projectpath secara realtime. Tidak ada kesalahan atau cara lain untuk mendeteksi masalah ini selain melihat tunggangan kosong di dalam tamu Anda.

Anda juga harus yakin untuk "membagikan drive" di Docker untuk pengaturan Windows.

rainabba
sumber
Saya mengalami masalah ini dengan Win10 / WSL dan Docker-CE / docker-ce. Kosong / jalur proyek /. Apa yang Anda maksud dengan "work from / c / projectpath"? Saya mencoba menghubungkan / c / ke / mnt / c dan berlari dari /c/projectpathtetapi kemudian saya mendapatkan kesalahan bind mount source path does not exist: /host_mnt/c/projectpath.
Steven T. Snyder
Tautan ini memecahkan masalah saya: support.divio.com/local-development/docker/… (Docker di Windows hanya memungkinkan pemasangan dari / Pengguna / secara default)
Steven T. Snyder
7

Saya menemukan bahwa setiap direktori meletakkan di bawah sistem direktif seperti /var, /usr, /etctidak dapat me-mount di bawah wadah.

Arahan harus berada di -vsaklar ruang pengguna menginstruksikan docker daemon untuk me-mount direktori lokal ke wadah, misalnya:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}
Mansur Ali
sumber
5

boot2docker bersama dengan VirtualBox Guest Additions
Cara me-mount / Pengguna ke boot2docker

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr Bangun custom boot2docker.iso Anda sendiri dengan Tambahan Tamu VirtualBox (lihat tautan ) atau unduh http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso dan simpan untuk ~ / .boot2docker / boot2docker.iso.

mattes
sumber
Saya mencoba menggunakan iso itu dan saya masih mengalami masalah yang sama ... Menggunakan petunjuk yang diuraikan dalam posting itu membantu saya untuk mengatasinya - saya pada dasarnya harus memaksa folder bersama.
Jaco Pretorius
Saya menggunakan iso, tersandung bahwa saya tidak akan menghentikan Virtual Box VM sebelum memanggil 'VBoxManage sharedfolder add ...' cmd. Akhirnya semuanya bekerja dengan baik, terima kasih banyak.
Emile
Catatan: alasan -v arg doens't bekerja melalui boot2docker, tampaknya ada hubungannya dengan pemasangan ke boot2docker-vm dan bukan host aktual Anda. itulah sebabnya saya kira bagian Vboxmanage membantu kerjanya.
Emile
5

Bagaimana cara menautkan main_folder ke folder test_container yang ada di dalam wadah buruh pelabuhan?

Perintah Anda di bawah ini benar, kecuali jika Anda menggunakan mac menggunakan boot2docker (tergantung pada pembaruan di masa mendatang) dalam hal ini Anda mungkin menemukan folder kosong. Lihat jawaban mattes untuk tutorial tentang memperbaiki hal ini.

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

Saya perlu menjalankan ini secara otomatis, bagaimana melakukannya tanpa benar-benar menggunakan perintah run -d -v.

Anda tidak dapat benar-benar melarikan diri dari menggunakan perintah ini, mereka intrinsik dengan cara kerja buruh pelabuhan. Sebaiknya Anda menempatkan mereka ke dalam skrip shell untuk menyelamatkan Anda menulisnya berulang kali.

Apa yang terjadi jika boot2docker crash? Di mana file buruh pelabuhan disimpan?

Jika Anda berhasil menggunakan -v arg dan referensi mesin host Anda maka file akan aman di host Anda.

Jika Anda telah menggunakan 'buruh pelabuhan build -t myimage.' dengan Dockerfile maka file Anda akan dimasukkan ke dalam gambar.

Gambar buruh pelabuhan Anda, saya percaya, disimpan di boot2docker-vm. Saya menemukan ini ketika gambar saya hilang ketika saya menghapus vm dari VirtualBox. (Catatan, saya tidak tahu cara kerja Virtualbox, sehingga gambar mungkin masih disembunyikan di tempat lain, hanya saja tidak terlihat oleh buruh pelabuhan).

Emile
sumber
5

Punya masalah yang sama. Menemukan ini di dokumentasi buruh pelabuhan :

Catatan: Direktori host, pada dasarnya, bergantung pada host. Untuk alasan ini, Anda tidak dapat memasang direktori host dari Dockerfile, instruksi VOLUME tidak mendukung melewati direktori host, karena gambar yang dibuat harus portabel. Direktori host tidak akan tersedia di semua host potensial.

Jadi, pemasangan direktori host baca / tulis hanya dimungkinkan dengan -vparameter dalam docker runperintah, karena jawaban lainnya menunjukkan dengan benar.

matthaeus
sumber
Apa sebenarnya direktori host?
Nicolas S.Xu
@ NicolasS.Xu Setiap jalan di mesin host buruh pelabuhan yang sebenarnya.
J. Scott Elblein
5

Berikut ini contoh dengan jalur Windows:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

Sebagai catatan, selama semua penarik rambut ini, harus bergulat dengan mencari tahu, dan mengetik ulang jalur berulang-ulang, saya memutuskan untuk menyiapkan AutoHotkeyskrip kecil untuk mengubah jalur Windows menjadi "Docker Windows berformat " . Dengan cara ini yang harus saya lakukan adalah menyalin semua jalur Windows yang ingin saya gunakan sebagai titik mount ke clipboard, tekan "Tombol Aplikasi" pada keyboard, dan itu akan memformatnya menjadi format jalur yang dihargai Docker.

Sebagai contoh:

Salin ini ke clipboard Anda:

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

tekan tombol Apps Keysementara kursor berada di tempat yang Anda inginkan pada command-line, dan itu akan menempelkannya di sana:

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

Menghemat banyak waktu untuk saya. Ini untuk siapa saja yang mungkin merasa berguna.

; --------------------------------------------------------------------------------------------------------------
;
; 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 
J. Scott Elblein
sumber
4

Agar ini berfungsi di Windows 10 saya harus membuka jendela Pengaturan Docker dari baki sistem dan pergi ke bagian Shared Drives .

Saya kemudian mencentang kotak di sebelah C. Docker meminta kredensial desktop saya untuk mendapatkan otorisasi untuk menulis ke folder Pengguna saya.

Lalu saya menjalankan docker container mengikuti contoh-contoh di atas dan juga contoh di halaman pengaturan itu, melampirkan ke /datadalam container.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
Adam Smith
sumber
3

Perhatikan bahwa pada Windows Anda harus menyediakan jalur absolut.

Di bawah ini bekerja untuk saya.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash
Chankey Pathak
sumber
3

saya memiliki masalah yang sama, saya mencoba untuk me-mount folder C: \ Users \ pada buruh pelabuhan
ini adalah bagaimana saya melakukannya baris perintah Docker Toolbox

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>
Abhishek DK
sumber
2

Saya memiliki persyaratan yang sama untuk me-mount direktori host dari kontainer dan saya menggunakan perintah mount volume. Tetapi selama pengujian memperhatikan bahwa itu membuat file di dalam wadah juga, tetapi setelah beberapa penggalian menemukan bahwa mereka hanya link simbolis dan sistem file yang sebenarnya digunakan dari mesin host.

Sunil Chauraha
sumber
2

Anda juga dapat melakukan ini dengan aplikasi web Portainer untuk pengalaman visual yang berbeda.

Pertama-tama tarik gambar Portainer:

docker pull portainer/portainer

Kemudian buat volume untuk Portainer:

docker volume create portainer_data

Juga buat wadah 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

Anda akan dapat mengakses aplikasi web dengan browser Anda di URL ini: " http: // localhost: 9000 ". Pada login pertama, Anda akan diminta untuk mengatur kredensial admin Portainer Anda.

Di aplikasi web, ikuti menu dan tombol ini: (Wadah> Tambah wadah> Pengaturan isi > Menyebarkan Wadah)

Saya mengalami masalah untuk membuat volume "mount" dengan Portainer dan saya menyadari bahwa saya harus mengklik "bind" ketika membuat volume kontainer saya. Di bawah ini adalah ilustrasi pengaturan pengikatan volume yang berfungsi untuk pembuatan wadah saya dengan volume yang terpasang diikat ke host.

pengaturan volume yang mengikat

PS: Saya menggunakan Docker 19.035 dan Portainer 1.23.1

Michael Fayad
sumber