Том Overlayfs в контейнер докеров
У меня есть набор каталогов, которые я хотел бы наложить на монтирование в контейнер:
# On host
/opt/a
- bin
- lib
/opt/b
- bin
- lib
/opt/c
- bin
- lib
# In container
/usr/local
- bin
- lib
- cuda
Я могу создать монтирование overlayfs на хост-машине для
/opt/{a,b,c}
и смонтируйте его как том в
/usr/local
в контейнере, но потом
/usr/local/cuda
будет недоступен в контейнере.
Я могу добиться этого напрямую с помощью
systemd-nspawn
со следующим:
systemd-nspawn --overlay /opt/a:/opt/b:/opt/c:/usr/local <other flags>
Это делает все файлы доступными как объединенное монтирование в
/usr/local
в контейнере с изменениями, записанными в
/opt/c
на хосте.
Можно ли легко добиться того, чего я хочу, с помощью докера?
1 ответ
Нет. Если вы достаточно знакомы с инструментами хоста, чтобы попытаться это сделать, рассмотрите возможность запуска его в
chroot
вместо этого окружающая среда.
Docker не имеет возможности объединить содержимое изображений, содержимое тома и каталоги хост-системы. Монтирование работает так же, как и обычная команда Unix mount(8): то, что вы монтируете, полностью скрывает все, что было раньше, и вы видите только смонтированное содержимое.
Также необычно запускать контейнер, который сильно зависит от содержимого хост-системы. Как правило, образ включает весь код приложения и библиотеки, необходимый для запуска программного обеспечения; таким образом вы можете запустить его в другой системе, даже если это программное обеспечение отсутствует на хосте. То есть более типично устанавливать необходимое программное обеспечение прямо в Dockerfile, например,
apt-get install
для образов на основе Debian/Ubuntu. Если различные
/opt
вещи - это вещи, которые вы собираете из исходного кода, вы можете использовать многоступенчатую сборку, чтобы установить их из исходного кода, а затем на последнем этапе
COPY --from=opt-a-build
в
/usr/local
дерево.