Terakhir kali saya memeriksa, Docker tidak memiliki sarana untuk memberikan akses kontainer ke serial host atau port USB . Apakah ada trik yang memungkinkan melakukan itu?
149
Terakhir kali saya memeriksa, Docker tidak memiliki sarana untuk memberikan akses kontainer ke serial host atau port USB . Apakah ada trik yang memungkinkan melakukan itu?
Ada beberapa opsi. Anda dapat menggunakan --device
bendera yang dapat digunakan untuk mengakses perangkat USB tanpa --privileged
mode:
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
Atau, dengan asumsi perangkat USB Anda tersedia dengan driver yang berfungsi, dll. Pada host di /dev/bus/usb
, Anda dapat memasang ini di wadah menggunakan mode hak istimewa dan opsi volume . Sebagai contoh:
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash
Perhatikan bahwa seperti namanya, --privileged
adalah tidak aman dan harus ditangani dengan hati-hati.
Dengan versi Docker saat ini, Anda dapat menggunakan
--device
flag untuk mencapai apa yang Anda inginkan, tanpa perlu memberikan akses ke semua perangkat USB.Misalnya, jika Anda ingin membuatnya hanya
/dev/ttyUSB0
dapat diakses di dalam container Docker Anda, Anda dapat melakukan sesuatu seperti:sumber
--device
bendera, bagaimana cara menentukan/dev/<device>
perangkat Android yang terkait di mesin host, terutama saat menggunakan Terminal Quickstart Docker (VirtualBox Host) untuk Windows atau Mac?--device
bekerja sampai perangkat USB Anda dicabut / dicolokkan dan kemudian berhenti bekerja. Anda harus menggunakan perangkat cgroup. Izinkan untuk menyiasatinya.Anda bisa saja menggunakan
-v /dev:/dev
tapi itu tidak aman karena memetakan semua perangkat dari host Anda ke dalam wadah, termasuk perangkat disk mentah dan sebagainya. Pada dasarnya ini memungkinkan container untuk mendapatkan root pada host, yang biasanya bukan yang Anda inginkan.Menggunakan pendekatan cgroups lebih baik dalam hal itu dan berfungsi pada perangkat yang ditambahkan setelah penampung saat dimulai.
Lihat detailnya di sini: Mengakses Perangkat USB Di Docker tanpa menggunakan --privileged
Agak sulit untuk menempelkannya, tetapi secara singkat, Anda perlu mendapatkan nomor mayor untuk perangkat karakter Anda dan mengirimkannya ke cgroup:
189 adalah angka utama dari / dev / ttyUSB *, yang bisa Anda dapatkan dengan 'ls -l'. Ini mungkin berbeda di sistem Anda dari pada milik saya:
Kemudian mulai wadah Anda seperti ini:
tanpa melakukan ini, perangkat yang baru dicolokkan atau di-boot ulang setelah penampung dimulai, akan mendapatkan ID bus baru dan tidak akan diizinkan akses di penampung.
sumber
189
harus diganti. Penjelasan tentang apa yang harus dikirimdevices.allow
dapat ditemukan di sini: kernel.org/doc/Documentation/cgroup-v1/devices.txtSaya ingin memperluas jawaban yang sudah diberikan untuk menyertakan dukungan untuk perangkat yang terhubung secara dinamis yang tidak ditangkap dengan
/dev/bus/usb
dan cara membuatnya berfungsi saat menggunakan host Windows bersama dengan VM boot2docker.Jika Anda bekerja dengan Windows, Anda harus menambahkan aturan USB apa pun untuk perangkat yang Anda ingin akses Docker dalam manajer VirtualBox. Untuk melakukan ini, Anda dapat menghentikan VM dengan menjalankan:
Buka VirtualBox Manager dan tambahkan dukungan USB dengan filter sesuai kebutuhan.
Mulai VM boot2docker:
Karena perangkat USB terhubung ke VM boot2docker, perintah harus dijalankan dari mesin itu. Buka terminal dengan VM dan jalankan perintah jalankan buruh pelabuhan:
Catatan, ketika perintah dijalankan seperti ini, maka hanya perangkat USB yang terhubung sebelumnya yang akan ditangkap. Bendera volume hanya diperlukan jika Anda ingin ini bekerja dengan perangkat yang terhubung setelah penampung dimulai. Dalam hal ini, Anda dapat menggunakan:
Catatan, saya harus menggunakan
/dev
alih-alih/dev/bus/usb
dalam beberapa kasus untuk menangkap perangkat seperti/dev/sg2
. Saya hanya dapat berasumsi bahwa hal yang sama berlaku untuk perangkat seperti/dev/ttyACM0
atau/dev/ttyUSB0
.Perintah menjalankan buruh pelabuhan akan bekerja dengan host Linux juga.
sumber
Jika Anda ingin mengakses perangkat USB secara dinamis yang dapat dicolokkan saat penampung buruh pelabuhan sudah berjalan, misalnya mengakses webcam usb yang baru saja terpasang di / dev / video0, Anda dapat menambahkan aturan cgroup saat memulai penampung. Opsi ini tidak memerlukan kontainer --privileged dan hanya mengizinkan akses ke jenis perangkat keras tertentu.
Langkah 1
Periksa nomor utama perangkat dari jenis perangkat yang ingin Anda tambahkan. Anda dapat mencarinya di dokumentasi kernel linux . Atau Anda dapat memeriksanya untuk perangkat Anda. Misalnya untuk memeriksa nomor utama perangkat untuk webcam yang terhubung ke / dev / video0, Anda dapat melakukan
ls -la /dev/video0
. Ini menghasilkan sesuatu seperti:Dimana angka pertama (81) adalah angka utama perangkat. Beberapa nomor utama perangkat umum:
Langkah 2
Tambahkan aturan saat Anda memulai container buruh pelabuhan:
--device-cgroup-rule='c major_number:* rmw'
aturan untuk setiap jenis perangkat yang ingin Anda akses-v /run/udev:/run/udev:ro
-v /dev:/dev
Bungkus
Jadi untuk menambahkan semua webcam usb dan perangkat serial2usb ke container docker Anda, lakukan:
sumber
Pilihan lainnya adalah menyesuaikan udev, yang mengontrol bagaimana perangkat dipasang dan dengan hak istimewa apa. Berguna untuk mengizinkan akses non-root ke perangkat serial. Jika Anda memiliki perangkat yang terpasang secara permanen,
--device
opsinya adalah cara terbaik untuk pergi. Jika Anda memiliki perangkat singkat, inilah yang telah saya gunakan:1. Tetapkan aturan udev
Secara default, perangkat serial dipasang sehingga hanya pengguna root yang dapat mengakses perangkat. Kita perlu menambahkan aturan udev agar dapat dibaca oleh pengguna non-root.
Buat file bernama /etc/udev/rules.d/99-serial.rules. Tambahkan baris berikut ke file itu:
KERNEL=="ttyUSB[0-9]*",MODE="0666"
MODE = "0666" akan memberikan izin baca / tulis (tetapi tidak mengeksekusi) ke perangkat ttyUSB Anda kepada semua pengguna. Ini adalah opsi yang paling permisif, dan Anda mungkin ingin membatasinya lebih lanjut tergantung pada persyaratan keamanan Anda. Anda dapat membaca di udev untuk mempelajari lebih lanjut tentang mengontrol apa yang terjadi ketika perangkat dicolokkan ke gateway Linux.
2. Pasang folder / dev dari host ke container
Perangkat serial sering kali bersifat sementara (dapat dicolokkan dan dicabut setiap saat). Karena itu, kami tidak dapat memasang di perangkat langsung atau bahkan folder / dev / serial, karena folder tersebut dapat hilang ketika ada yang dicabut. Bahkan jika Anda menyambungkannya kembali dan perangkat muncul lagi, secara teknis itu adalah file yang berbeda dari yang dipasang, jadi Docker tidak akan melihatnya. Untuk alasan ini, kami memasang seluruh folder / dev dari host ke container. Anda dapat melakukan ini dengan menambahkan perintah volume berikut ke perintah jalankan Docker Anda:
-v /dev:/dev
Jika perangkat Anda terpasang secara permanen, menggunakan opsi --device atau pemasangan volume yang lebih spesifik kemungkinan merupakan opsi yang lebih baik dari perspektif keamanan.
3. Jalankan wadah dalam mode hak istimewa
Jika Anda tidak menggunakan opsi --device dan dipasang di seluruh / dev folder, Anda akan diminta untuk menjalankan kontainer dalam mode privileged (saya akan memeriksa hal-hal cgroup yang disebutkan di atas untuk melihat apakah ini dapat dihapus ). Anda dapat melakukan ini dengan menambahkan yang berikut ini ke perintah jalankan Docker Anda:
--privileged
4. Akses perangkat dari folder / dev / serial / by-id
Jika perangkat Anda dapat dicolokkan dan dicabut, Linux tidak menjamin perangkat akan selalu dipasang di lokasi ttyUSBxxx yang sama (terutama jika Anda memiliki banyak perangkat). Untungnya, Linux akan membuat symlink secara otomatis ke perangkat di folder / dev / serial / by-id. File dalam folder ini akan selalu diberi nama yang sama.
Ini adalah ikhtisar singkat, saya memiliki artikel blog yang menjelaskan lebih detail.
sumber
Sulit bagi kami untuk mengikat perangkat USB tertentu ke wadah buruh pelabuhan yang juga spesifik. Seperti yang Anda lihat, cara yang disarankan untuk mencapainya adalah:
Ini akan mengikat semua perangkat ke wadah ini. Tidak aman. Setiap kontainer diberikan untuk mengoperasikan semuanya.
Cara lain adalah mengikat perangkat dengan devpath. Ini mungkin terlihat seperti:
atau
--device
(lebih baik, tidakprivileged
):Jauh lebih aman. Tetapi sebenarnya sulit untuk mengetahui apa itu devpath perangkat tertentu.
Saya telah menulis repo ini untuk mengatasi masalah ini.
https://github.com/williamfzc/usb2container
Setelah menerapkan server ini, Anda dapat dengan mudah mendapatkan semua informasi perangkat yang terhubung melalui permintaan HTTP:
dan dapatkan:
dan mengikatnya ke wadah Anda. Misalnya, Anda dapat melihat DEVNAME perangkat ini adalah
/dev/bus/usb/001/120
:Mungkin itu akan membantu.
sumber
Dengan versi buruh pelabuhan terbaru, ini sudah cukup:
Ini akan memberikan akses ke semua sumber daya sistem (dalam / dev misalnya)
sumber
Menambah jawaban di atas, bagi yang ingin cara cepat menggunakan perangkat USB eksternal (HDD, flash drive) yang berfungsi di dalam buruh pelabuhan, dan tidak menggunakan mode priviledged:
Temukan devpath ke perangkat Anda di host:
Anda dapat mengenali drive Anda berdasarkan kapasitasnya dengan mudah dari daftar. Salin jalur ini (untuk contoh berikut
/dev/sda2
).Pasang jalur dev ini (lebih disukai
/media
):Anda kemudian dapat menggunakan ini sebagai parameter untuk
docker run
menyukai:atau di buruh pelabuhan menulis di bawah volume:
Dan sekarang ketika Anda menjalankan dan memasuki penampung Anda, Anda harus dapat mengakses drive di dalam penampung di
/media/<mount folder name>
PENOLAKAN:
sumber