
Я пытаюсь хранить свою конфигурацию Docker, образы, контейнеры и т. д. на внешнем хранилище. Следуя этому руководству https://www.howtogeek.com/devops/how-to-store-docker-images-and-containers-on-an-external-drive/
Я создал /etc/docker/daemon.json:
{
"data-root": "/media/user/MYUSB/docker-data"
}
Но когда я подключаю свой USB-накопитель (MYUSB) и запускаю службу Docker, эта функция дает сбой.
$ sudo service docker start
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
$ sudo dockerd --debug
INFO[2023-07-06T12:36:29.650356567+02:00] Starting up
could not create or set daemon root permissions: /media/user/MYUSB/docker-data: chown /media/user/MYUSB/docker-data: operation not permitted
А если я перезагружу компьютер, служба вместо этого создаст новую чистую папку MYSUB для хранения данных, а система смонтирует мой реальный USB-накопитель как MYUSB1 (и не будет использовать его для хранения данных Docker).
Моя система монтирует мой usb-ключ, и разрешения установлены на user:user, а не root:root, так что, возможно, это отсюда. Но мне кажется любопытным, что служба docker (которая, как я предполагаю, запускается root) не может использовать хранилище user:user.
Если я попытаюсь вручную смонтировать usb с правами пользователя root. Папка /media/user/MYUSB, которую я создаю, установлена на root:root, пока я не смонтирую в нее usb: ее владелец изменится на user:user.
Я немного сбит с толку, так как, похоже, я единственный, кто столкнулся с этой проблемой в Интернете, хотя на первый взгляд это не выглядит чем-то необычным.
решение1
Попробовав некоторые вещи, я пришел к выводу, что ваш USB-флеш-накопитель имеет FAT32 или другую файловую систему, которая не поддерживает разрешения POSIX. Вы не можете использовать такую файловую систему с Docker. Но это еще не все!
Автоматически монтируемые файловые системы также не подходят для Docker, поскольку они монтируются с помощьюносуидинодев. Корневая файловая система Linux (которая обычно находится внутри образов Docker) не может быть правильно размещена на нем. Вы можете проверить это с помощью mount | grep media
. (Автоматическое монтирование обычно работает с помощьюudisks2в эти дни.)
Во-первых, вам следует поместить соответствующую файловую систему на ваш флэш-накопитель (например,ext4).
Затем вы должны убедиться, чтоudisks2не монтирует файловую систему (с неподходящими параметрами и слишком поздно). Вы можете использоватьудевправило, заставляющее его игнорировать файловую систему:
SUBSYSTEM=="block", ENV{ID_FS_UUID}=="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX", ENV{UDISKS_IGNORE}="1"
Вы поместите это в файл с именем типа /etc/udev/rules.d/99-ignore-my-usb.rules
. Вы можете найти UUID файловой системы для вашей недавно созданной файловой системы, используя blkid
.
Затем вы создадите соответствующую запись в /etc/fstab
(снова используя UUID), чтобы убедиться, что USB-флешка смонтирована достаточно рано. Не нужно возиться с какой-либо конфигурацией Docker, просто смонтируйте ее в /var/lib/docker
, каталог данных Docker по умолчанию. Что-то вроде этого:
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX /var/lib/docker ext4 relatime 0 0
Чтобы убедиться, что все работает нормально, просто перезагрузитесь. Docker должен запуститься и mount
подтвердить, что флешка действительно смонтирована в /var/lib/docker
.
Ваш флэш-накопитель Docker становится портативным – в некотором роде. Вы не должны просто вынимать его, когда ПК работает. Сначала остановите Docker, отмонтируйте его и только потом вынимайте. В противном случае вы рискуете повредить файловую систему, и Docker в конечном итоге, конечно, рухнет.