Genellikle, ana bilgisayar birimi bağlama birimiyle ilgili izin sorunları, kapsayıcı içindeki uid / gid, ana bilgisayardaki dosyanın uid / gid izinlerine göre dosyaya erişememesidir. Ancak, bu özel durum farklıdır.
İzin dizesinin sonundaki nokta, drwxr-xr-x.
SELinux'un yapılandırıldığını gösterir. SELinux ile bir ana bilgisayar bağlantısı kullanırken, birim tanımının sonuna fazladan bir seçenek iletmeniz gerekir:
z
Seçenek monte Bind içeriğin birden fazla kaplarda arasında paylaşılan olduğunu gösterir.
Z
Seçenek monte Bind içeriği gizli ve paylaşılmamış olduğunu gösterir.
Birim bağlama komutunuz şöyle görünecektir:
sudo docker run -i -v /data1/Downloads:/Downloads:z ubuntu bash
SELinux ile ana bilgisayar bağlantıları hakkında daha fazla bilgi için: https://docs.docker.com/storage/#configure-the-selinux-label
Farklı bir kullanıcı olarak çalışan kapsayıcılar ile bu sorunu gören diğerleri için, kapsayıcı içindeki kullanıcının uid / gid'in ana bilgisayardaki dosyaya izinleri olduğundan emin olmanız gerekir. Üretim sunucularında, bu genellikle görüntü oluşturma işlemindeki uid / gid'i, dosyalara erişimi olan ana bilgisayardaki bir uid / gid ile eşleşecek şekilde denetleyerek yapılır (veya daha da iyisi, üretimde ana bilgisayar bağlarını kullanmayın).
Adlandırılmış bir birim, ana bilgisayar bağları için genellikle tercih edilir, çünkü herhangi bir dosya sahipliği ve izinleri de dahil olmak üzere birim dizinini görüntü dizininden başlatır. Bu, birim boş olduğunda ve kap belirtilen birimle oluşturulduğunda gerçekleşir.
MacOS kullanıcıları artık Mac ana bilgisayarı ve kapsayıcılar arasında uid / gid'leri otomatik olarak işleyen OSXFS'ye sahip. Yardım etmediği bir yer, /var/lib/docker.sock gibi, kabın içine monte edilen gömülü VM'nin içindeki dosyalardır.
Ana bilgisayar uid / gid'in geliştirici başına değişebileceği geliştirme ortamları için, tercih ettiğim çözüm, kapsayıcıyı kök olarak çalışan bir giriş noktasıyla başlatmak, kullanıcının uid / gid'i ana bilgisayar hacmine uid / gid ile eşleşecek şekilde kap içinde düzeltmek ve daha sonra gosu
uygulamayı kap içinde çalıştırmak için kökten kapsayıcı kullanıcısına bırakmak için kullanın. Bunun için önemli komut dosyası fix-perms
şu adreste bulunan temel resim komut dosyalarındadır: https://github.com/sudo-bmitch/docker-base
fix-perms
Senaryonun önemli kısmı:
# update the uid
if [ -n "$opt_u" ]; then
OLD_UID=$(getent passwd "${opt_u}" | cut -f3 -d:)
NEW_UID=$(stat -c "%u" "$1")
if [ "$OLD_UID" != "$NEW_UID" ]; then
echo "Changing UID of $opt_u from $OLD_UID to $NEW_UID"
usermod -u "$NEW_UID" -o "$opt_u"
if [ -n "$opt_r" ]; then
find / -xdev -user "$OLD_UID" -exec chown -h "$opt_u" {} \;
fi
fi
fi
Bu, kullanıcının kapsayıcısının uid değerini ve dosyanın uid'ini alır ve eşleşmezlerse, usermod
uid'i ayarlamak için çağrı yapar. Son olarak uid en değişmemiş dosyaları düzeltmek için özyinelemeli bir bulma yapar. -u $(id -u):$(id -g)
Yukarıdaki giriş noktası kodu kapsayıcıyı başlatmak için bir komut dosyası çalıştırmak için her geliştiriciyi gerektirmediği ve kullanıcının sahip olduğu birimin dışındaki dosyaların izinleri düzeltildiğinden , bir bayrakla kapsayıcı çalıştırmaktan daha iyi bunu seviyorum .
Ayrıca, docker cihazına bağlama bağlama gerçekleştiren adlandırılmış bir birim kullanarak görüntüden bir ana bilgisayar dizini başlatmasını da sağlayabilirsiniz. Bu dizinin önceden var olması gerekir ve bir oluşturma dosyasındaki göreli yollar olabilecek ana bilgisayar birimlerinin aksine, ana bilgisayar dizinine mutlak bir yol sağlamanız gerekir. Docker'ın başlatması için dizin de boş olmalıdır. Bir bağlanan bağlama birimine adlandırılmış bir birimi tanımlamak için üç farklı seçenek aşağıdaki gibidir:
# create the volume in advance
$ docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
# create on the fly with --mount
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
foo
# inside a docker-compose file
...
volumes:
bind-test:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
...
Son olarak, kullanıcı ad alanlarını kullanmayı denerseniz, kapsayıcıların uid / gid değerleri değiştiği için ana bilgisayar birimlerinin izin sorunları olduğunu göreceksiniz. Bu senaryoda, ana bilgisayar birimlerinden kaçınmak ve yalnızca adlandırılmış birimler kullanmak en kolay yoldur.