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:
- Bagaimana saya harus menautkan main_folder ke folder test_container yang ada di dalam wadah buruh pelabuhan?
- Saya perlu membuat ini secara otomatis. Bagaimana saya melakukannya tanpa benar-benar menggunakan
run -d -v
perintah? - Apa yang terjadi jika boot2docker lumpuh? Di mana file Docker disimpan (selain dari Dockerfile)?
docker
mount
boot2docker
Kishore Vaishnav
sumber
sumber
Jawaban:
Ada beberapa cara Anda bisa melakukan ini. Cara paling sederhana untuk melakukannya adalah dengan menggunakan
ADD
perintah dockerfile seperti: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
.tar
dan 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
-v
bendera saat menggunakan buruh pelabuhan jalankan seperti ini:sumber
ADD
sebenarnya tidak "me-mount" itu menyalin file ke dalam wadah bertahan di dalamnya.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
mount
bukan-v
. Berikut dokumentasinya:--mount
: Terdiri dari beberapa pasangan nilai kunci, dipisahkan dengan koma. Setiap pasangan kunci / nilai berbentuk<key>=<value>
tuple. The--mount
sintaks lebih verbose dari-v
atau--volume
, tetapi urutan tombol tidak signifikan, dan nilai bendera adalah lebih mudah untuk memahami.The
type
dari gunung, yang dapatbind
,volume
atautmpfs
. (Kita akan menggunakan bind )The
source
dari mount. Untuk bind mounts, ini adalah path ke file atau direktori pada host daemon Docker. Dapat ditentukan sebagaisource
atausrc
.The
destination
mengambil sebagai nilainya jalan di mana file atau direktori akan dipasang dalam wadah. Dapat ditentukan sebagaidestination
,dst
, atautarget
.Jadi, untuk memasang direktori saat ini (sumber) dengan
/test_container
(target) kita akan menggunakan:Jika parameter mount ini memiliki spasi, Anda harus memberi tanda kutip di sekitarnya. Ketika saya tahu mereka tidak melakukannya, saya akan menggunakan
`pwd`
:Anda juga harus berurusan dengan izin file, lihat artikel ini .
sumber
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:
1) Pasang sistem lokal pada
boot2docker
2) Pasang
boot2docker
file pada wadah linuxKemudian ketika Anda
ls
di dalamcontainerfolder
Anda akan melihat konten Andahostfolder
.sumber
net share
perintah 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.mount: unknown filesystem type 'vboxsf'
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.
sumber
docker run -t -i -v /tmp:/tmp ubuntu /bin/bash
mana host/tmp
akan dipasang pada wadah/tmp
. Sekarang satu dapattouch /tmp/hello-world
dari wadah dan melihat file muncul di host.Apakah mungkin Anda menggunakan buruh pelabuhan pada OS X melalui
boot2docker
atau 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/host
sebenarnya dipetakan dariboot2docker
VM-image, bukan Mac Anda.Anda harus mem-pipe folder bersama melalui VM Anda ke host aktual Anda (Mac dalam kasus saya).
sumber
[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
/private
awalan. 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:
Sekarang bagikan folder ke VirtualBox:
Akhirnya, ssh ke docker-machine lagi dan pasang folder yang baru saja kita bagikan:
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.
sumber
docker-machine
dokumen.-v
bendera?-v
bendera tidak berfungsi seperti yang Anda harapkan di OS X (atau windows). Docker berjalan di VM sehingga folder direferensikan dalam-v
poin ke folder di VM, bukan di OS root. Teknik ini mengambil langkah selanjutnya memetakan folder VM kembali ke root OS./Users
untuk 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/development
atau apa pun selain/Users
Anda akan memiliki masalah docs.docker.com/engine/userguide/containers/dockervolumesSaya 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:
sumber
Di sistem saya, saya sudah mengoreksi jawaban dari nhjk, ini berfungsi dengan sempurna ketika Anda menambahkan
-t
flag.sumber
Jika host adalah windows 10 maka alih-alih maju slash, gunakan backward slash -
Pastikan drive host dibagi (C dalam kasus ini). Dalam kasus saya, saya mendapat prompt meminta izin berbagi setelah menjalankan perintah di atas.
sumber
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
sumber
Pembaruan Jul 2015 - boot2docker sekarang mendukung pemasangan langsung. Anda dapat menggunakan
-v /var/logs/on/host:/var/logs/in/container
langsung dari prompt Mac Anda, tanpa pemasangan gandasumber
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:Kemudian untuk mengujinya, Anda bisa melakukannya
echo TEST > hostTest.txt
di dalam gambar Anda. Anda seharusnya dapat melihat file baru ini di folder host lokal diC:/Users/C/Desktop/dockerStorage/
.sumber
-v $(pwd):/var/xx
dulu dan itu berhasil, tetapi menghasilkan direktori kosong. Saya menjalankan cyg via babun.Saya pernah mengalami masalah yang sama. Baris perintah saya terlihat seperti ini:
Masalahnya dengan 'pwd'. Jadi saya mengubahnya menjadi $ (pwd):
sumber
z
?Pada Docker 18-CE, Anda dapat menggunakan
docker run -v /src/path:/container/path
untuk 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 mencobanya
docker 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}:/projectpath
dan 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.
sumber
/c/projectpath
tetapi kemudian saya mendapatkan kesalahanbind mount source path does not exist: /host_mnt/c/projectpath
.Saya menemukan bahwa setiap direktori meletakkan di bawah sistem direktif seperti
/var
,/usr
,/etc
tidak dapat me-mount di bawah wadah.Arahan harus berada di
-v
saklar ruang pengguna menginstruksikan docker daemon untuk me-mount direktori lokal ke wadah, misalnya:sumber
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
sumber
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.
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).
sumber
Punya masalah yang sama. Menemukan ini di dokumentasi buruh pelabuhan :
Jadi, pemasangan direktori host baca / tulis hanya dimungkinkan dengan
-v
parameter dalamdocker run
perintah, karena jawaban lainnya menunjukkan dengan benar.sumber
Berikut ini contoh dengan jalur Windows:
Sebagai catatan, selama semua penarik rambut ini, harus bergulat dengan mencari tahu, dan mengetik ulang jalur berulang-ulang, saya memutuskan untuk menyiapkan
AutoHotkey
skrip 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 Key
sementara 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.
sumber
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
/data
dalam container.sumber
Perhatikan bahwa pada Windows Anda harus menyediakan jalur absolut.
Di bawah ini bekerja untuk saya.
sumber
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
sumber
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.
sumber
Anda juga dapat melakukan ini dengan aplikasi web Portainer untuk pengalaman visual yang berbeda.
Pertama-tama tarik gambar Portainer:
Kemudian buat volume untuk Portainer:
Juga buat wadah 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.
PS: Saya menggunakan Docker 19.035 dan Portainer 1.23.1
sumber