次のコマンドを使用してdockerコンテナーを実行し、Host(/root/database
)からcontainer(/tmp/install/database
)にディレクトリをマップします。
# docker run -it --name Oracle_install -v /root/database:/tmp/install/database bofm/Oracle12c:preinstall bash
しかし、コンテナ内では、ls
を使用して/tmp/install/database/
のコンテンツを一覧表示することはできませんが、私はroot
であり、すべての権限を持っています。
[root@77eb235aceac /]# cd /tmp/install/database/
[root@77eb235aceac database]# ls
ls: cannot open directory .: Permission denied
[root@77eb235aceac database]# id
uid=0(root) gid=0(root) groups=0(root)
[root@77eb235aceac database]# cd ..
[root@77eb235aceac install]# ls -alt
......
drwxr-xr-x. 7 root root 4096 Jul 7 2014 database
Hostで/root/database
を確認しますが、すべて問題ありません。
[root@localhost ~]# ls -lt
......
drwxr-xr-x. 7 root root 4096 Jul 7 2014 database
Dockerコンテナが「Permission denied」というプロンプトを表示するのはなぜですか?
更新:
根本原因はSELinux
に関連しています。実際、昨年は同様の issue に出会いました。
共有ディレクトリのコンテナ内で許可が拒否されたのは、この共有ディレクトリがデバイスに保存されているためです。デフォルトでは、コンテナはどのデバイスにもアクセスできません。オプション$docker run --privileged
を追加すると、コンテナはallデバイスにアクセスし、カーネル呼び出しを実行できます。 これは安全とは見なされません。
デバイスを共有するよりクリーンな方法は、docker run --device=/dev/sdb
オプションを使用することです(/dev/sdb
が共有するデバイスの場合)。
Manページから:
--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.
Docker-composeを使用してnfsマウントポイントをボリュームとして共有すると、同様の問題が発生しました。次の方法で問題を解決できました。
docker-compose up --force-recreate
イベントを発見したとしても、これは他の誰かを助けるかもしれません。
別の理由は、UID/GIDとの不一致です。これは多くの場合、マウントをルートとして変更できるが、コンテナユーザーとしては変更できないと表示されます
UIDを設定できるため、ubuntuとして実行されているubuntuコンテナの場合、:uid=1000
(確認する id -u
)ユースケースに応じてUIDをローカルに設定します。
uid = valueおよびgid = value
ファイルシステム内のファイルの所有者とグループを設定します(デフォルト:uid = gid = 0)
このtmpfsの例については、このブログをご覧ください。
docker run \
--rm \
--read-only \
--tmpfs=/var/run/prosody:uid=100 \
-it learning/tmpfs