Могу ли я монтировать каталог хоста docker как копию при записи/наложении?
Я хотел бы установить хост-каталог в докере, который снаружи фактически доступен для чтения/только. Но я хотел бы, чтобы он появился внутри контейнера как чтение/запись.
Чтобы файлы/каталоги могли быть записаны, но не изменены снаружи. Возможно ли это, используя какой-либо процесс наложения?
Ответы
Ответ 1
Изменение: Проверьте @javabrett комментарий:
Проголосовано, несмотря на то, что это решение имеет закат, см. Ответ на вопрос об отключении overlay-upperdir -o n -o на ядрах 4.8 и новее. - Джавабретт 23 июля в 5:55
См.: fooobar.com/questions/312329/...
Вот что я делаю:
На хосте:
Загрузите каталог только для чтения.
docker run --privileged -v/path/on/host: /path/on/client-read-only:ro -it ubuntu/bin/bash
На клиенте:
На клиенте используйте OverlayFS поверх только что прочитанного каталога -o, смонтированного с хоста.
mount -t overlayfs none -o lowerdir=/path/on/client-read-only,upperdir=/path/on/client/path/on/client
Затем используйте /path/on/client
для чтения/записи файлов.
Редактировать: если у вас есть 3. 18+ ядро на вашем хосте, вы можете предпочесть использовать это на клиенте:
mount -t overlay overlay -o lowerdir=/path/on/client-read-only,upperdir=/path/on/client,workdir=/path/on/client-workdir/path/on/client
Который не overlayfs
. С overlayfs
меня была проблема, связанная с невозможностью использования rm
. overlay
решил эту проблему для меня.
Ответ 2
Больше не поддерживается изнутри контейнера (возможно, потому что overlay-over-overlay отключен в ядрах ~ 4.4)
$ uname -a && \
docker run --privileged --rm debian:latest sh -c "mkdir upper lower work merged && mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merged/; dmesg|tail -1"
Linux preprod 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux
mount: wrong fs type, bad option, bad superblock on overlay,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
[288426.860631] overlayfs: filesystem on 'upper' not supported as upperdir
В любом случае альтернативой является создание оверлея на хосте и привязка его к гостю:
$ mkdir upper lower work merged && \
touch upper/up lower/low && \
sudo mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merged/ && \
docker run --rm -v $(pwd)/merged:/tmp/merged debian:latest sh -c "touch /tmp/merged/new-from-container"
$ ls upper/lower/merged/
lower/:
low
merged/:
low new-from-container up
upper/:
new-from-container up
Ответ 3
Я бы рекомендовал посмотреть, поддерживает ли ваша файловая система overlayfs или нет; и его можно проверить с помощью
$> cat /proc/filesystems | grep overlayfs
$> overlayfs overlay
Если это так, то я бы рекомендовал вам создать overlayfs на хост-машине и смонтировать каталог слияния в контейнер Docker, чтобы вы могли управлять вещами с главной машины, а не с некоторых на хосте, а некоторые на контейнере Docker.
Я выполнил следующие шаги для этого: позвольте мне привести пример; У меня есть исходный код, и я хочу построить его для нескольких платформ, таких как i386, x86_64 и amd64; Исходный код останется таким же для всей платформы; где, поскольку исполняемый файл (.obj и exe) каждой платформы будет отличаться; поэтому нам нужен исполняемый файл в каждом конкретном каталоге платформы
sudo mount -t overlay overlay -o lowerdir=/home/viswesn/source-code,upperdir=/home/viswesn/i386_executable,workdir=/i386 /home/viswesn/i386_merged
sudo mount -t overlay overlay -o lowerdir=/home/viswesn/source-code,upperdir=/home/viswesn/x86_64_executable,workdir=/x86_64 /home/viswesn/x86_64_merged
В нем говорится, что любые файлы объектов или исполняемые файлы, созданные из исходных файлов, будут оставаться в каталоге /home/viswesn/X _executable, а исходный код останется в /home/viswesn/source -code; где as/home/viswesn/X_merged/будет содержать исходный код и исполняемый файл конкретной платформы;
Теперь мы должны установить каталог X_merged как том в контейнер Docker для создания исходного кода для каждой платформы
Для i386:
sudo docker run --privileged -v /home/viswesn/i386_merged/:/source-code -it ubuntu-trusty:14:01 /bin/bash
Для amd64:
sudo docker run --privileged -v /home/viswesn/amd64_merged/:/source-code -it ubuntu-amd64:14:01 /bin/bash
При этом один и тот же исходный код одновременно создается для всей платформы параллельно без нескольких копий исходного кода.
Ответ 4
Это возможно, если вы избегаете установки upperdir на локальный каталог (то есть уже наложение). Но вместо этого вы можете использовать tmpfs (протестировано на ядре 4.9):
# On the host to run the container
docker run --cap-add=SYS_ADMIN -i -t -v ~/host-folder-to-mount:/root/folder-ro:ro ubuntu
# Inside the container
# Need to create the upper and work dirs inside a tmpfs.
mkdir -p /tmp/overlay && \
mount -t tmpfs tmpfs /tmp/overlay && \
mkdir -p /tmp/overlay/{upper,work} && \
mkdir -p /root/folder && \
mount -t overlay overlay -o lowerdir=/root/folder-ro,upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work /root/folder
Все кредиты идут на https://gist.github.com/detunized/7c8fc4c37b49c5475e68ef9574587eee