Быть непривилегированным и корневым в контейнере Docker
Я хочу использовать pandoc внутри докера. Изображение выглядит так:
FROM debian:buster-slim
RUN apt-get update && apt-get install -y pandoc texlive
WORKDIR /home
Это build.sh
внутри проекта:
cp *.ttf /usr/local/share/fonts/ && fc-cache;
pandoc -o output.pdf input.md
что я хочу бежать так:
docker run --rm -t -v $(pwd):/home pandoc_container build.sh
Это приводит к output.pdf
будучи владельцем root на моем хосте. При выполнении:
docker run --user $(id -u) --rm -t -v $(pwd):/home pandoc_container build.sh
вместо этого файл будет принадлежать мне, но файлы шрифтов не могут быть скопированы в этот каталог из-за отсутствия разрешений на запись. Добавление
RUN chmod a+w /usr/local/share/fonts/
в Dockerfile решает это, но тогда команда fc-cache
терпит неудачу с большим количеством failed to write cache
ошибки также из-за отсутствия разрешений на запись во многих каталогах.
Копирование файлов шрифтов в ~/.fonts
не будет работать, потому что пользователь, созданный --user $(id -u)
на самом деле не существует в контейнере:
I have no name!@0d9c6a272ae1:/home$
и, следовательно, не имеет домашнего каталога, который может быть проанализирован fc-cache
,
Какой элегантный способ решить эту проблему?
1 ответ
Ответ так же прост, как добавление
chown $UID output.pdf
в build.sh
а затем передать docker env-var вместо идентификатора пользователя:
docker run -e UID=$(id -u) --rm -t -v $(pwd):/home pandoc_container build.sh