Началось все с того, что я решил экспортировать чаты дискорда. Для этого дела у нас есть 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. Как же меня заепло тратить вечера выходных на преодоление неочевидного поведения опенсорс-софта!