docker-compose を使用して nfs マウント ポイントをボリュームとして共有すると、同様の問題が発生しました。この問題は次の方法で解決できました:
docker-compose up --force-recreate
あなたが問題を見つけたとしても、これは他の誰かを助けるかもしれません.
共有ディレクトリのコンテナ内で拒否された権限は、この共有ディレクトリがデバイスに保存されていることが原因である可能性があります。デフォルトでは、コンテナはどのデバイスにもアクセスできません。オプション $docker run --privileged
の追加 コンテナが all にアクセスできるようにします デバイスとカーネル呼び出しを実行します。 これは安全とは見なされません。
デバイスを共有するよりクリーンな方法は、オプション docker run --device=/dev/sdb
を使用することです ( /dev/sdb
の場合 は共有したいデバイスです)。
マニュアルページから:
--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 container prompt Permission denied?
man docker-run
適切な答えを与える:
SELinux などのラベル付けシステムでは、コンテナーにマウントされたボリューム コンテンツに適切なラベルを配置する必要があります。ラベルがないと、セキュリティ システムによって、コンテナー内で実行されているプロセスがコンテンツを使用できなくなる可能性があります。デフォルトでは、Docker は OS によって設定されたラベルを変更しません。
コンテナー コンテキストでラベルを変更するには、2 つのサフィックス :z または :Z のいずれかをボリューム マウントに追加できます。これらのサフィックスは、共有ボリューム上のファイル オブジェクトのラベルを変更するよう Docker に指示します。 z オプションは、2 つのコンテナーがボリューム コンテンツを共有することを Docker に通知します。その結果、Docker はコンテンツに共有コンテンツ ラベルを付けます。共有ボリューム ラベルにより、すべてのコンテナがコンテンツを読み書きできるようになります。 Z オプションは、非共有の非公開ラベルでコンテンツにラベルを付けるよう Docker に指示します。現在のコンテナのみがプライベート ボリュームを使用できます。
例:
docker run -it --name oracle_install -v /root/database:/tmp/install/database:z ...
もう 1 つの理由は、UID/GID との不一致です。これは、多くの場合、ルートとしてマウントを変更できますが、コンテナー ユーザーとしては変更できません
UID を設定できるため、ubuntu として実行されている ubuntu コンテナーの場合は、:uid=1000
を追加する必要がある場合があります。 (id -u
で確認してください) ) またはユースケースに応じて UID をローカルに設定します。
uid=値とgid=値
ファイルシステム内のファイルの所有者とグループを設定します (デフォルト:uid=gid=0)
この tmpfs の例を含む良いブログがここにあります
docker run \
--rm \
--read-only \
--tmpfs=/var/run/prosody:uid=100 \
-it learning/tmpfs
http://www.dendeer.com/post/docker-tmpfs/