GNU/Linux >> Znalost Linux >  >> Linux

Proč kontejner dockeru zobrazí výzvu Permission denied?

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/


Linux
  1. Proč všichni používají Docker?

  2. hodně (Povolení odepřeno) v catalina.out

  3. Výzva Docker bash nezobrazuje barevný výstup

  1. Proč potřebuje uživatel root oprávnění sudo?

  2. povolení docker.sock odepřeno

  3. Proč chmod +w nedává oprávnění k zápisu ostatním (o)

  1. Proč Mv(1) kopíruje objekty, pokud je odepřeno povolení k pohybu?

  2. Jak opustit kontejner Docker

  3. Proč Deis a co to je?