Mac で Docker から USB デバイスにアクセスする方法

tl; dr

Docker for Mac ではできないが、docker-machine を使えばできる

詳細

  1. virtualbox をインストール
    • brew cask install virtualbox
    • brew cask install virtualbox-extension-pack
      • USB 2.0 以上を利用するために必要
  2. docker-machine で VM を作る
    • docker-machine create -d virtualbox vbox
  3. VM に USB デバイスをアタッチする
    • VM を一旦止める
      • docker-machine stop vbox
    • VM の USB xHCI を有効にする
      • VBoxManage modifyvm vbox --usbxhci on
    • USB デバイスを一覧して VendorId, ProductId を得る
      • VBoxManage list usbhost
    • VM に USB Device Filter を追加する
      • VBoxManage usbfilter add 1 --target vbox --name 'SanDisk Cruzer Colors+' --vendorid 0x0781 --productid 0x5170
      • --name は何でもよい。上記例は Manufacturer, Product の出力を参考にしている。
    • VM を起動する
      • docker-machine start vbox

確認

確認のために fdisk を実行してみる

[10:36:04] ~
(*'-') < docker $(docker-machine config vbox) run -it --rm --privileged debian
root@6bc97aaa2212:/# lsblk -o +VENDOR,MODEL
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT VENDOR   MODEL
sda      8:0    0  19.5G  0 disk            ATA      VBOX HARDDISK
|-sda1   8:1    0  18.6G  0 part /etc/hosts
`-sda2   8:2    0 964.8M  0 part [SWAP]
sdb      8:16   1   3.8G  0 disk            SanDisk  Cruzer Colors+
sr0     11:0    1    48M  0 rom             VBOX     CD-ROM
zram0  251:0    0 177.1M  0 disk [SWAP]
root@6bc97aaa2212:/#
root@6bc97aaa2212:/# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x0b7a7d6f.

Command (m for help): p
Disk /dev/sdb: 3.8 GiB, 4022337024 bytes, 7856127 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0b7a7d6f

経緯

USB メディアに対して syslinux コマンドを使いたかったのだけど OS X で動かすの大変そうだったので docker から操作できたら便利だなあと思って調べていた