如何从Docker容器内访问OSX主机上的USB驱动器?

问题描述:

我有一个应用程序,我最终想要在一个docker图像中打包的云计算服务上运行(例如,AWSGoogle Cloud)。应用程序需要在云中运行的原因是因为它旨在处理大型数据文件,但在实际部署之前,我想首先在本地笔记本电脑上测试它,并使用我已有的一个大型数据文件存储(用于测试和开发目的)在外部USB驱动器上。如何从Docker容器内访问OSX主机上的USB驱动器?

我的机器是OSX的笔记本电脑,而我使用的是最近的码头工人的版本:

stachyra> uname -a 
Darwin Andrews-MacBook-Pro-76.local 14.5.0 Darwin Kernel Version 14.5.0: Tue Sep 1 21:23:09 PDT 2015; root:xnu-2782.50.1~1/RELEASE_X86_64 x86_64 
stachyra> docker --version 
Docker version 1.10.2, build c3959b1 

OSX已经安装我的外部USB驱动器,设备/dev/disk2s2,为/Volumes/MGR DATA

stachyra> df 
Filesystem 512-blocks  Used Available Capacity iused ifree %iused Mounted on 
/dev/disk1  974770480 435721376 538537104 45% 54529170 67317138 45% /
devfs    375  375   0 100%  650  0 100% /dev 
map -hosts    0   0   0 100%   0  0 100% /net 
map auto_home   0   0   0 100%   0  0 100% /home 
/dev/disk2s2 3906291632 3869523640 36767992 100% 483690453 4595999 99% /Volumes/MGR DATA 
/dev/disk3s1  196608  193160  3448 99%  24143  431 98% /Volumes/VirtualBox 
stachyra> diskutil list 
/dev/disk0 
    #:      TYPE NAME     SIZE  IDENTIFIER 
    0:  GUID_partition_scheme      *500.3 GB disk0 
    1:      EFI EFI      209.7 MB disk0s1 
    2:   Apple_CoreStorage       499.4 GB disk0s2 
    3:     Apple_Boot Recovery HD    650.0 MB disk0s3 
/dev/disk1 
    #:      TYPE NAME     SIZE  IDENTIFIER 
    0:     Apple_HFS Macintosh HD   *499.1 GB disk1 
           Logical Volume on disk0s2 
           DB70B91A-3B57-4C82-A758-C4BDEA4160FD 
           Unlocked Encrypted 
/dev/disk2 
    #:      TYPE NAME     SIZE  IDENTIFIER 
    0:  GUID_partition_scheme      *2.0 TB  disk2 
    1:      EFI EFI      209.7 MB disk2s1 
    2:     Apple_HFS MGR DATA    2.0 TB  disk2s2 
/dev/disk3 
    #:      TYPE NAME     SIZE  IDENTIFIER 
    0:  GUID_partition_scheme      *100.7 MB disk3 
    1:     Apple_HFS VirtualBox    100.7 MB disk3s1 

并且还应该注意,驱动器有几个目录和数据可以在其中看到,至少在直接通过OSX查看时:

stachyra> ls -l /Volumes/MGR\ DATA 
total 0 
drwxr-xr-x 6 stachyra staff 204 Apr 14 2015 1000genomes 
drwxr-xr-x 5 stachyra staff 170 Oct 12 17:41 GIAB 
drwxr-xr-x 4 stachyra staff 136 Apr 28 2015 genome_browser_tracks 
drwxr-xr-x 24 stachyra staff 816 Oct 6 14:00 mitty 

我试图遵循this question的建议,该建议描述了docker在linux主机中运行时如何在docker中安装USB驱动器。但我的本地笔记本电脑是OSX,而​​不是Linux,所以它似乎没有工作。

明确,试图跟随accepted answer的意见时,我得到以下结果:

stachyra> docker run -i -t --privileged -v /dev/disk2s2:/dev/foo ubuntu bash 
[email protected]:/# uname -a 
Linux 8da7b492a707 4.1.18-boot2docker #1 SMP Sat Feb 20 08:24:27 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 
[email protected]:/# ls -l /dev/foo 
total 0 
[email protected]:/# 

基于响应,人们可以看到,搬运工人确实正确地启动Linux容器,它也根据请求在容器内部创建卷/ dev/foo,但无法通过该位置访问USB驱动器的实际内容 - ls -l命令声称在那里没有文件或目录。

我也试过在alternate response对同一问题描述的第二种方法,以及失败更糟糕:

stachyra> docker run -i -t --device=/dev/disk2s2 ubuntu bash 
docker: Error response from daemon: error gathering device information while adding custom device "/dev/disk2s2": not a device node. 
                                   stachyra> 

我发现另一个discussion thread上计算器这表明原始USB的访问完全不同的处理OSX比Linux,我怀疑这可能是上述两个USB访问尝试失败的原因。

但是,我应该怎么做呢?也就是说,什么是正确的操作或命令序列,以便docker访问安装在OSX主机上的USB设备,而不是Linux?

+0

试试这个http://stackoverflow.com/questions/30040708/how-to-mount-local-volumes-in-docker-machine/32030385#32030385 –

+0

@warmoverflow:谢谢,这有些帮助,但不幸的是它并不完全让我一直在那里。我确实能够按照其他答案中概述的步骤在Oracle VM Virtualbox * virtual * *机器*内部安装USB驱动器(具体来说,在docker似乎用于运行docker引擎的“默认”机器中) ,但是,它似乎并没有在docker * container *里面工作 - mount命令给我一个权限被拒绝的错误。如何在码头集装箱内安装USB驱动器,具体如何? – stachyra

+0

你是否按照'boot2docker'部分使用'uid'完全如答案?这可能是许可问题的关键。 –

我终于能够通过使用warmoverflow的评论,像这样

machine-diskutil.sh mount my-machine-name /Volumes/my-usb-drive 

提到machine-diskutil.sh脚本,然后启动容器,像这样

docker run -v /Volumes/my-usb-drive:/var/media -it my/image:latest bash 
在/ var /媒体访问我的容器内我的USB驱动器

因为我曾尝试在VirtualBox中手动添加/ Volumes/my-usb-drive作为共享文件夹,所以首先出现此错误。

Error: The shared folder /Volumes/Seagate already exists on the docker machine, please unmount it first.

所以我手动删除,并重新运行该命令machine-diskutil.sh mount没有任何问题。好东西!