Kök izinleri olmayan bir docker kapsayıcısına nasıl dosya eklenir?


16

Resmi tomcatgörüntüden oluşturulan bir Docker görüntüsüne dosya eklemeye çalışıyorum . tomcatEğer bash çalıştırırsam kullanıcı olarak oturum açtığım için bu görüntünün kök hakları yok gibi görünüyor :

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

DockerfileBir dosyayı bu kapsayıcıya kopyalamamı istersem dosyanın izinleri vardır 644ve sahibi olur root. Anladığım kadarıyla, Dockerfile'daki tüm komutlar kök olarak çalıştırıldığı için makul görünüyor. Ancak, bu dosyanın sahipliğini değiştirmeye çalışırsam tomcat:tomcatbir Operation not permittedhata alıyorum.

Bu görüntüye kopyalanan bir dosyanın izinlerini neden değiştiremiyorum?

Nasıl çoğaltılabilir:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

Çıktı docker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1

Yanıtlar:


20

Tomcat için Dockerfile'ı görüntülemenin ve değiştirmenin bir yolu var, ancak birkaç dakika sonra anlayamıyorum. Benim yetersiz çözüm bu satırı chown önce eklemek:

USER root

Bundan sonra ayrıcalıkları kaldırmak istiyorsanız (bu önerilir) bu satırı ekleyebilirsiniz:

USER tomcat

Alternatif olarak, kurulu olmayan bir görüntü ile çalışın, böylece Dockerfile'ınızı root olarak başlatabilir ve tomcat ve diğerlerini yükleyebilirsiniz. Aslında kendi imajlarında bunu deneyimlerimden değiştirmeleri tuhaf. Hedeflenen son kullanıcının USER yönergesini uygun gördükleri şekilde ayarlamasına izin vermek mantıklıdır.


Bu gerçekten işe yarıyor! ADD ve COPY komutlarının neden sahibi ile dosya oluşturduğunu tesadüfen biliyor musunuz root? USERDirektifi neden dikkate almıyorlar ?
nyi

1
Genellikle, kullanıcı hesaplarının sistemde ne olacağını bilmenin gerçek bir yolu olmadığından, direktifin ayarlandığı temel görüntüleri görmezsiniz. Docker'ın çalışması gereken şey bu olduğundan, dosyaların kök olarak oluşturulması da daha kolay olabilir. Makul bir geliştirme isteği gibi görünüyor, işler USER yönergesinde belirtilenlere otomatik olarak sahip olsaydı Dockerfiles oluşturmayı basitleştirecekti.
theterribletrivium

Beni gerçekten sefaletimden kurtardı. Jenkins görüntüsüne ssh anahtarları eklemem gerekiyordu.
Kostas Demiris

8

Docker 17.09 beri --chown, kaydettiğiniz görüntünün boyutunu artıran chown ile ayrı bir RUN işlemi yerine ADD / COPY adımında sahibini değiştirmek için Dockerfile'daki ADD / COPY işlemlerindeki bayrağı kullanabilir . Bunu varsayılan mod olarak kullanmak iyi olurdu, yani dosyaları kopyalayan kullanıcının izinleri kopyalanan dosyalara uygulanır. Ancak Docker ekibi geriye dönük uyumluluğu kırmak istemedi ve yeni bir bayrak getirdi.

COPY --chown=<user>:<group> <hostPath> <containerPath>

Diğer alternatifler:

  1. Görüntüyü oluşturmadan önce bir hazırlama klasöründeki izni değiştirin.
  2. Kapsayıcıyı, sahibini değiştiren bir önyükleme komut dosyası aracılığıyla çalıştırın.
  3. Katmanları ez!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.