Монтирование bind в Linux не выполняет никакого пространства имен для uid или gid, а монтирование хоста выполняет монтирование bind под крышками. Поэтому, если uid внутри контейнера отличается от uid на хосте, вы получите проблемы с разрешениями. Я работал над этим в других контейнерах с помощью скрипта fix-perms Реализация, которая выглядит как следующий Dockerfile:
FROM selenium/node-chrome-debug:3.141.59-neon
COPY --from=sudobmitch/base:scratch /usr/bin/gosu /usr/bin/fix-perms /usr/bin/
COPY entrypoint.sh /entrypoint.sh
# use a chmod here if you cannot fix permissions outside of docker
RUN chmod 755 /entrypoint.sh
USER root
ENTRYPOINT [ "/entrypoint.sh" ]
entrypoint.sh выглядит так:
#!/bin/sh
if [ "$(id -u)" = "0" -a -d "/home/seluser/Downloads" ]; then
fix-perms -r -u seluser /home/seluser/Downloads
exec gosu seluser /opt/bin/entry_point.sh "$@"
else
exec /opt/bin/entry_point.sh "$@"
fi
Здесь происходит то, что контейнер запускается с правами root, а скрипт fix-perms корректирует seluser
внутри контейнера в соответствии с uid каталога /home/seluser/Downloads
. exec gosu
затем запускает ваш контейнерный процесс как привилегированный пользователь как новый pid 1.
Вы можете увидеть код, используемый для реализации этого по адресу: https://github.com/sudo-bmitch/docker-base
Я обсуждал этот метод в нескольких своих презентациях, в том числе: https://sudo -bmitch.github.io / Presentations / dc2019 / tips-and-tricks-of-the-captains.html # fix- завивка