Началось все с того, что я решил экспортировать чаты дискорда. Для этого дела у нас есть DiscordChatExporter, написанный на дотнете. К нему есть докерфайл, позволяющий создать образ и запускать его где попало (я запускаю в консоли под линуксом и планирую запускать по крону).
Запускается экспорт так:
arris@blacktower:~$ docker run --rm --user 1000:1000 -v /home/arris/out/:/app/out/ tyrrrz/discordchatexporter:latest export <параметры>
Если каталог /home/arris/out/ существует и права на него у пользователя 1000:1000 (то есть arris:arris) - то всё зашибись, экспорт работает и мы в шоколаде.
А вот если целевой каталог НЕ СУЩЕСТВУЕТ - докер-демон его радостно создает, а потом экспорт падает с Permission Denied. Потому что, внезапно,
arris@blacktower:~$ ls -la /home/arris/out/
total 8
drwxr-xr-x 2 root root 4096 Feb 6 21:46 .
drwxr-xr-x 9 arris arris 4096 Feb 6 21:46 ..
и писать в каталог нельзя потому что принадлежит он руту. Если же убрать у docker run параметр --user - экспорт идет корректно, без ошибок, но все экспортированные файлы принадлежат руту. В общем, не то, что хочется!
WTF???
Дело в том, что докер, который докер-демон - работает под рутом, а пользователю всего-то позволено (если он добавлен в группу docker) посылать ему команды. Поэтому каталог создается под рутом, и это поведение "by design". И нет, в сети нет решения, но есть множество вопросов пользователей "почему так?". Патамушта! Патамушта бай дизайн!
И что делать?
Конкретно для данной проблемы решение я выдумал такое:
EXPORT_PATH=/path/to/ && mkdir -p ${EXPORT_PATH} && docker run --rm --user $(id -u):$(id -g) -v ${EXPORT_PATH}:/app/out/ tyrrrz/discordchatexporter:latest <command><options>
Каталог указываем по вкусу, например EXPORT_PATH=${PWD}/export/ - тогда экспорт будет в подкаталог export текущего каталога запуска:
EXPORT_PATH=${PWD}/export/ && mkdir -p ${EXPORT_PATH} && docker run --rm --user $(id -u):$(id -g) -v ${EXPORT_PATH}:/app/out/ tyrrrz/discordchatexporter:latest <command><options>
P.S. Как же меня заепло тратить вечера выходных на преодоление неочевидного поведения опенсорс-софта!