Měl jsem podobný problém při sdílení bodu připojení nfs jako svazku pomocí docker-compose. Problém se mi podařilo vyřešit pomocí:
docker-compose up --force-recreate
I když jste problém našli, může to pomoci někomu jinému.
Oprávnění odepřené v kontejneru pro sdílený adresář může být způsobeno tím, že tento sdílený adresář je uložen v zařízení. Ve výchozím nastavení nemají kontejnery přístup k žádnému zařízení. Přidání možnosti $docker run --privileged
umožňuje kontejneru přístup všem zařízení a provádí volání jádra. Toto není považováno za bezpečné.
Čistším způsobem sdílení zařízení je použití možnosti docker run --device=/dev/sdb
(pokud /dev/sdb
je zařízení, které chcete sdílet).
Z manuálové stránky:
--device=[] Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm) --privileged=true|false Give extended privileges to this container. The default is false. By default, Docker containers are “unprivileged” (=false) and cannot, for example, run a Docker daemon inside the Docker container. This is because by default a container is not allowed to access any devices. A “privileged” container is given access to all devices. When the operator executes docker run --privileged, Docker will enable access to all devices on the host as well as set some configuration in AppArmor to allow the container nearly all the same access to the host as processes running outside of a container on the host.
Dostal jsem odpověď z komentáře pod:Proč kontejner dockeru vyzve Permission denied?
man docker-run
dává správnou odpověď:
Štítkovací systémy, jako je SELinux, vyžadují, aby byly na obsah svazku namontované v kontejneru umístěny správné štítky. Bez štítku může bezpečnostní systém zabránit procesům běžícím uvnitř kontejneru v používání obsahu. Ve výchozím nastavení Docker nemění štítky nastavené operačním systémem.
Chcete-li změnit štítek v kontextu kontejneru, můžete k připojení svazku přidat jednu ze dvou přípon :z nebo :Z. Tyto přípony říkají Dockeru, aby přejmenoval objekty souborů na sdílených svazcích. Možnost z říká Dockeru, že dva kontejnery sdílejí obsah svazku. Výsledkem je, že Docker označí obsah štítkem sdíleného obsahu. Štítky sdílených svazků umožňují všem kontejnerům číst/zapisovat obsah. Možnost Z říká Dockeru, aby označil obsah soukromým nesdíleným štítkem. Soukromý svazek může používat pouze aktuální kontejner.
Například:
docker run -it --name oracle_install -v /root/database:/tmp/install/database:z ...
Dalším důvodem je neshoda s UID/GID. To se často ukazuje jako možnost upravit připojení jako root, ale ne jako uživatel kontejnerů
Můžete nastavit UID, takže pro kontejner ubuntu běžící jako ubuntu možná budete muset přidat :uid=1000
(zkontrolujte pomocí id -u
) nebo nastavte UID lokálně v závislosti na vašem případu použití.
uid=hodnota a gid=hodnota
Nastavte vlastníka a skupinu souborů v souborovém systému (výchozí:uid=gid=0)
Je zde o tom dobrý blog s tímto příkladem tmpfs
docker run \
--rm \
--read-only \
--tmpfs=/var/run/prosody:uid=100 \
-it learning/tmpfs
http://www.dendeer.com/post/docker-tmpfs/