2015-05-27 5 views
0

У меня есть небольшое приложение на Python, которое я бы хотел запустить на Linux в Docker (теперь с помощью boot2docker). Это приложение считывает некоторые данные из моего общего сетевого ресурса Windows, который отлично работает в Windows с использованием сетевого пути, но не работает в Linux. Проведя некоторое исследование, я выяснил, как установить общий ресурс Windows на Ubuntu. Я пытаюсь реализовать файл докеров, чтобы он установил для меня эту долю, но пока не увенчался успехом. Ниже мой текущий подход, который встречает операцию, не разрешенную командой mount во время процесса сборки.Docker - Mount Windows Network Share Inside Container

#Sample Python functionality 
import os 
folders = os.listdir(r"\\myshare\folder name") 

#Dockerfile 
RUN apt-get install cifs-utils -y 
RUN mkdir -p "//myshare/folder name" 
RUN mount -t cifs "//myshare/folder name" "//myshare/folder name" -o username=MyUserName,password=MyPassword 

#Error at mount during docker build 
#"mount: error(1): Operation not permitted" 
#Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) 

Редактировать Не дубликатом Mount SMB/CIFS share within a Docker container. Решение этого вопроса ссылается на исправление в течение docker run. Я не могу запустить --privileged, если процесс сборки docker завершился неудачно.


Q: Что такое правильный способ смонтировать сетевую папку Windows, внутри контейнера Докер?


ответ

0

Вы правы, что вы можете использовать только --privileged во docker run. Вы не можете выполнять операции mount без --privileged, ergo, вы не можете выполнять операции монтирования во время процесса docker build.

Возможно, это по дизайну: цель заключается в том, что файл докеров в основном автономно; каждый должен иметь возможность использовать ваше Dockerfile и другое содержимое в том же каталоге для создания того же изображения; привязка вещей к внешнему монстру нарушит это ограничение.

Тем не менее, в вашем вопросе говорится, что у вас есть приложение, которое должно прочитать некоторые данные из общей папки, поэтому неясно, зачем нужна доля, установленная во время docker build. Похоже, вам лучше создать образ, который запустит ваше приложение как часть docker run, и, возможно, используйте docker volumes для доступа к ресурсу, а не для его установки внутри контейнера.

+0

Я попытался запустить базовое изображение Ubuntu, где я смонтировал том следующим образом: 'docker run -v" // myshare/имя папки ":" // myshare/имя папки "'. Однако, когда я вхожу в контейнер в интерактивном режиме, папка есть, но ни один из файлов и папок не указан. Я подозреваю, что это связано с тем, что сетевой ресурс контролируется доступом. Моя учетная запись пользователя выше имеет доступ к этой папке и может перемещаться по папкам, когда я монтирую ее на обычной виртуальной машине Ubuntu. Есть ли в любом случае для меня использование Docker Volume с контролируемой доступом? – user4794170

0

Не использовали Docker, чтобы это не применимо, однако если вы перечислите свою долю в /etc/fstab и включите опцию user, вы можете разрешить непривилегированным пользователям монтировать ее, например. из вашего скрипта.

иметь также в виду, что mkdir -p "//myshare/folder name" является полуинвалида путь - большинство оболочек будет конденсироваться // в /, так что вы не можете иметь доступ к папке /myshare/folder name с корневой каталог системы Linux не нормально, когда вы кладете файлы. Возможно, вам удастся добиться большего успеха, используя вместо этого /mnt/myshare-foldername.