Saya memiliki masalah yang sama ketika membagikan nfs mount point sebagai volume menggunakan docker-compose. Saya dapat menyelesaikan masalah dengan:
docker-compose up --force-recreate
Meskipun Anda menemukan masalahnya, ini dapat membantu orang lain.
Izin yang ditolak dalam wadah untuk direktori bersama mungkin karena fakta bahwa direktori bersama ini disimpan di perangkat. Secara default wadah tidak dapat mengakses perangkat apa pun. Menambahkan opsi $docker run --privileged
mengizinkan penampung untuk mengakses semua perangkat dan melakukan panggilan Kernel. Ini tidak dianggap aman.
Cara yang lebih bersih untuk berbagi perangkat adalah dengan menggunakan opsi docker run --device=/dev/sdb
(jika /dev/sdb
adalah perangkat yang ingin Anda bagikan).
Dari halaman manual:
--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.
Saya mendapat jawaban dari komentar di bawah:Mengapa docker container meminta Izin ditolak?
man docker-run
memberikan jawaban yang tepat:
Sistem pelabelan seperti SELinux mengharuskan label yang tepat ditempatkan pada konten volume yang dipasang ke dalam wadah. Tanpa label, sistem keamanan mungkin mencegah proses yang berjalan di dalam kontainer menggunakan konten. Secara default, Docker tidak mengubah label yang ditetapkan oleh OS.
Untuk mengubah label dalam konteks wadah, Anda dapat menambahkan salah satu dari dua sufiks :z atau :Z ke mount volume. Sufiks ini memberi tahu Docker untuk memberi label ulang objek file pada volume bersama. Opsi z memberi tahu Docker bahwa dua kontainer berbagi konten volume. Akibatnya, Docker melabeli konten dengan label konten bersama. Label volume bersama memungkinkan semua wadah untuk membaca/menulis konten. Opsi Z memberi tahu Docker untuk memberi label konten dengan label pribadi yang tidak dibagikan. Hanya penampung saat ini yang dapat menggunakan volume pribadi.
Misalnya:
docker run -it --name oracle_install -v /root/database:/tmp/install/database:z ...
Alasan lainnya adalah ketidaksesuaian dengan UID/GID. Ini sering muncul sebagai kemampuan untuk memodifikasi mount sebagai root tetapi tidak sebagai pengguna container
Anda dapat mengatur UID, jadi untuk wadah ubuntu yang berjalan sebagai ubuntu, Anda mungkin perlu menambahkan :uid=1000
(periksa dengan id -u
) atau setel UID secara lokal bergantung pada kasus penggunaan Anda.
uid=nilai dan gid=nilai
Tetapkan pemilik dan grup file di sistem file (default:uid=gid=0)
Ada blog bagus tentang ini di sini dengan contoh tmpfs ini
docker run \
--rm \
--read-only \
--tmpfs=/var/run/prosody:uid=100 \
-it learning/tmpfs
http://www.dendeer.com/post/docker-tmpfs/