chmod Docker'da düzgün çalışmıyor


19

SymfonyUygulamam için bir Docker görüntüsü oluşturuyorum ve önbellek ve günlük klasörlerine yazmak için apache sunucusuna izin vermem gerekiyor

#Dockerfile
FROM php:7-apache

RUN apt-get update \
&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite

COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html

RUN find /var/www/html/ -type d -exec chmod 755 {} \; 
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Bu resmi ile docker build -t myname/symfony_apps:latest .oluşturup kapsayıcıyı çalıştırdığımda docker run -p 8080:80 myname/symfony_apps:latest. Apache günlüğü, izin reddedilen hatalar, kontrol ettiğim garip şey ls -ave izinler iyi durumda. ve chmod'u kabın bash'ından çalıştırdığımda, apache izni sorunları gitti ve uygulama iyi çalışıyor

Durum

Dockerfile'dan chmod komutlarını çalıştırma: izinler değiştirildi, ancak apache hala izin verilmediğinden şikayet ediyor. Kapsayıcı içinde bash ile chmod aynı komutları çalıştırma: izinler değiştirildi ve uygulamam çalışıyor

Herhangi bir fikir, bir şey eksik mi, belki Dockerfile bir yere kök kullanıcı eklemek gerekir?


Yerleşik görüntüyü çalıştıran docker komutunuzu görmek faydalı olacaktır.
Mike

Son komutunuzda fazladan boşluk görüyorum (telefonumdayım, bu yüzden emin olamıyorum). İzin sorunu günlük dizininde olduğu gibi, son satırı şu şekilde değiştirin: `` `RUN chmod -R 777 / var / www / html / app / cache / var / www / html / app / logs` `
Mike

1
Tamam .. Soruyu düzenledim :)
fırtına

bu ekstra alan bir yazım hatasıydı
fırtına

Sorununuzu yeniden oluşturamıyorum. Dockerfile'ınızı kullanır ve yerel olarak bazı kukla dosyalar kurarsam, izinler doğrudur ve her şey Sadece Çalışır. Bir kapsayıcıyı önyükleyebilir ve bir web tarayıcısı üzerinden içeriğe erişebilirim. Sorunuzu belirli hata mesajlarını içerecek şekilde güncelleyebilir misiniz? Apache yapılandırmanızın ( apache2.conf) bir soruna neden olmadığından emin misiniz ? Yüklemezseniz hatalar ortadan kalkar apache2.confmı?
larsks

Yanıtlar:


16

Aynı sorunu vardı ve dizin içeriği bir katmanda oluşturulur ve izinleri diğer değiştirilirse docker veya overlay2 bazı hata var gibi görünüyor.

Çözüm olarak kaynakları geçici dizine kopyalayabilirsiniz:

COPY . /src

Ve sonra onu /var/www/htmlve kurulum izinlerini taşıyın (tek RUNkomutta):

RUN rm -rf /var/www/html && mv /src /var/www/html &&\
    find /var/www/html/ -type d -exec chmod 755 {} \; &&\
    find /var/www/html/ -type f -exec chmod 644 {} \; &&\
    chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Ayrıca GitHub sorunu oluşturdum .


Bunu nasıl çözdüğümü görmek için bu gece eski kaynak kodumu inceleyecektim, o zaman tmp dizin hilesini hatırladım .. umarım bu
fırtına

7

Docker'daki RUN varsayılan kabuğu / bin / sh'dir ve burada doğru ayarlanmayan izinlerin gerçekte bir sorunu vardır.

Ancak kolayca düzeltmek için / bin / bash komutunu kullanabilirsiniz, dizin listelemeden önce ve sonra dikkat edin

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'
---> Running in dc57ae77aa67

drwxr-xr-x. 3 root root      103 Mar  8 17:56 .
drwxr-xr-x. 1 root root       46 Mar  8 17:57 ..
drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
-rw-r--r--. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar

drwxr-xr-x. 1 root root       42 Mar  8 17:56 .
drwxr-xr-x. 1 root root       61 Mar  8 17:57 ..
drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
-rwxr-xr-x. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar
---> 8b5de6e348d3

2
Neden /bin/bash -c 'chmod +x file'çalışıyor ve çalışmıyor /bin/sh -c 'chmod +x file'?
fırtına

daha iyi bir çözümdür. benim için çalıştı. Teşekkürler .
user1427944

Ayrıca, yeni yapı setini kullanmak, bunu da içeren birçok alanda yardımcı olur. Bir şans ver. docs.docker.com/develop/develop-images/build_enhancements
Thad Guidry

6

Eklemeyi deneyin:

USER root

Benim için çalıştı.


Bu kabul edilen cevap olmalı.
Vladimir Kornea

2
Köke geçiş yaparsanız, işiniz bittiğinde veya kabın güvenliğini ve uyumluluğunu azalttığınızda muhtemelen önceki kullanıcıya geri dönmeniz gerekir. Bazı Kubernetes uygulamaları varsayılan olarak kök olarak bir kap çalıştırmaz.
flickerfly

2

Bu sorun muhtemelen VOLUMEyukarı akış Dockerfile içindeki bir tanımın sonucudur. Dockerfile'da bir birim tanımlandığında, doğrudan görüntüye COPYveya ADDkomutuyla dosyalar ekleyebilirsiniz . Ancak, bir RUNsatır:

  • Dockerfile dosyasının geçerli noktasından itibaren görüntü tanımını kullanarak geçici bir kap oluşturun
    • Bu geçici kapsayıcı, siz veya Dockerfile içinde belirtilen bir üst resim olarak monte edilmiş anonim bir hacme sahip olacak
    • Anonim hacim görüntünün içeriğinden başlatılacak
  • Komutunuz konteynerin içinde çalışacak
    • Bu RUNkomut sırasında dizini listelerseniz, değişikliklerinizin uygulandığını görürsünüz, ancak bu değişiklikler birime uygulandı
  • Çalıştırma komutunuz tamamlandığında, docker kapsayıcıdaki değişiklikleri yakalar
    • Bu değişiklikler docker diff, geçici kapsayıcıları silmemeniz durumunda a ile görülebilir ( --rm=falsebunların kalmasını sağlamak için bir yapı çalıştırabilirsiniz )
    • Geçici kapsayıcı dosya sisteminde bulunmadığından, bu değişiklikler anonim cilt içeriğini içermez, birimler ayrıdır

Bu davranış nedeniyle, aşağıdakiler için seçenekleriniz vardır:

  1. dosyalarınızı farklı bir dizine kopyalayabilir ve buradaki izinleri değiştirebilirsiniz
  2. ana makinenizdeki izinleri, bu izinlerle doğrudan kopyalanmaları için düzeltebilirsiniz
  3. birimi görüntünüzden kaldırabilir, birim tanımlarını kaldırmak için yukarı akış görüntüsünü alabilir veya birim tanımı olmadan kendi yukarı akış görüntüsünün kendi kopyasını yeniden oluşturabilir ve resimlerinizi buna dayanarak oluşturabilirsiniz.

Mevcut php görüntülerinin içinde, birimin kaldırıldığı anlaşılıyor, bu da etkin bir şekilde seçenek 3'e sahip olduğumuz anlamına geliyor.


0

Sadece aşağıdakilerle bir deneme yaptım:

FROM alpine

LABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"
RUN apk add --no-cache inotify-tools
CMD [ "./script.sh" ]
WORKDIR /opt/app/
COPY src/ /opt/app/
RUN chmod a+x *.sh

Ve sadece harika çalışıyor.

ancak

Docker-compose birimleri aracılığıyla bu yürütülebilir dosyayı geçersiz kıldığımda, executeizin basitçe geri alınır gibi - teknik olarak orijinal dosya iznine geçersiz kılındı.

Dev modu için düzeltme basitçe etmektir chmod a+x yourfilemontaj oluşturma ses seviyesinde miras edilecek konak, gelen.


1
Bir birimin tüm amacı, dosyaları görüntüden başka bir yerden monte etmektir, bu nedenle görüntünüzü düzeltir ve bunun üzerine bir birim bağlarsanız, tasarım gereği görüntü değişikliklerinizi görmezsiniz. Neden bir cildiniz olduğuna bağlı olarak, cevap basitçe bir cilde sahip olmamak olabilir.
BMitch

Evet BMitch , docker yapılı görüntüden konteyner f'lerini geçersiz kılan montaj hacminin etkisi konusunda tamamen katılıyorum, ancak ... Geliştirme sırasında, her bir değişikliği test etmek için konteynerinizi yeniden oluşturmak / yeniden başlatmak istemezsiniz. yapmak. Bu son senaryoda, docker tarafından oluşturulan görüntü f'lerini geçersiz kılan bir birimin bağlanmasını istiyorsunuz. Ve buraya gelmeden önce aynı sorunla karşılaştım. Her iki cevap açıklamasından da suçlu bulunmadım ve her birini test ettim. Ancak o zaman neler olduğunu anladım ve gözlemlerimi gönderdim ...
Salathiel Genèse

... ve yaşadığım senaryonun soruyu soran senaryo ile aynı olduğundan şüpheleniyorum.
Salathiel Genèse

OP sorunu sadece bir docker runkomutla gördüklerini ve harici bir birim takılmadığını belirtti.
BMitch

Oups - Bu yönü kaçırdım ... Doğru soru başlığı için doğru cevap, ancak açıklanan senaryo değil. O zaman yukarıda belirtilen konuyu tekrarlayamadığımı söyleyebilir miyim.
Salathiel Genèse
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.