Я работаю над упаковкой научного программного обеспечения в образ докера с помощью boot2docker в Mac OS X. И это программное обеспечение (https://github.com/voutcn/megahit.git) использует именованные каналы (в коде Python, но это не важно) для подключения различных частей (написанных на C) друг к другу. Я монтирую временную папку с хост-машины Mac OS X, чтобы предоставить рабочую область в контейнере докеров (потому что временный вывод программного обеспечения может быть огромным) примерно так:
docker run -v /external/folder:/tmp/scratch <image> <args>
Это дает мне эту строку монтирования внутри контейнера:
none on /tmp/scratch type vboxsf (rw,nodev,relatime)
И внутри этой смонтированной папки создание именованного канала не удается, когда он выполняется внутри контейнера. Это даже не связано с python, C или каким-либо конкретным языком. Я дважды проверил команду linux mkfifo pipe1
в этой папке с ошибкой:
mkfifo: cannot create fifo 'pipe1': Operation not permitted
Однако он хорошо работает для любой внутренней не смонтированной папки внутри контейнера. Почему это происходит и как это исправить?
PS: Вот что я делаю, чтобы легко воспроизвести проблему.
1) Mac OS X с boot2docker
2) Dockerfile:
FROM ubuntu:14.04
#WORKDIR /tmp <- this one would work
WORKDIR /tmp/scratch
ENTRYPOINT [ "mkfifo" ]
CMD [ "pipe1" ]
3) Построение изображения:
docker build --rm -t mine/namedpipes:latest .
4) Выполняется (находится в папке внешнего хоста, которую нужно смонтировать):
docker run -v $(pwd):/tmp/scratch mine/namedpipes:latest