chmod tidak berfungsi dengan benar di Docker

Saya sedang membangun citra Docker untuk saya Symfony aplikasi dan saya perlu memberikan izin ke server apache untuk menulis ke dalam cache dan folder log

#DockerfileFROM php:7-apacheRUN apt-get update \&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \&& docker-php-ext-install intl mbstring \&& a2enmod rewriteCOPY app/php.ini /usr/local/etc/php/COPY app/apache2.conf /etc/apache2/apache2.confCOPY ./ /var/www/htmlRUN 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

Ketika saya membangun gambar ini dengan docker build -t myname/symfony_apps:latest . dan jalankan wadah dengan docker run -p 8080:80 myname/symfony_apps:latest.Log Apache dibanjiri oleh kesalahan izin ditolak , hal aneh yang telah saya periksa ls -a dan izin baik-baik saja. dan ketika saya menjalankan chmod dari bash container , masalah izin apache hilang dan aplikasi berfungsi dengan baik

Situasi

Menjalankan perintah chmod dari dockerfile: perizinan berubah tapi apache masih mengeluh tentang Izin ditolak.Menjalankan perintah chmod yang sama dengan bash di dalam wadah: izin diubah dan aplikasi saya sedang berjalan

Ada ide , apakah saya kehilangan sesuatu, mungkin saya harus menambahkan pengguna root di suatu tempat di Dockerfile ?

Saya memiliki masalah yang sama dan tampaknya ada beberapa bug di docker atau overlay2 jika konten direktori dibuat dalam satu lapisan dan izinnya diubah di lapisan lain.

Sebagai solusi, Anda dapat menyalin sumber ke direktori sementara:

COPY . /src

Dan kemudian memindahkannya ke /var/www/html dan izin pengaturan (dalam satu RUN command):

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

Juga saya buat Masalah GitHub.

Coba tambahkan :

USER root

Ini bekerja untuk saya.

Shell default RUN di Docker adalah / bin / sh dan di sinilah izin yang tidak disetel dengan benar sebenarnya memiliki masalah.

Tapi Anda dapat mengubah hanya menggunakan / bin / bash bukan untuk dengan mudah memperbaiki, pemberitahuan sebelum dan sesudah daftar direktori

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'---> Running in dc57ae77aa67drwxr-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.jardrwxr-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

Masalah ini kemungkinan merupakan hasil dari VOLUME definisi di dalam Dockerfile upstream. Ketika volume didefinisikan dalam Dockerfile, Anda dapat menambahkan file dengan COPY atau ADD perintah langsung ke gambar. Namun, a RUN line akan:

  • Buat wadah sementara menggunakan definisi gambar pada titik dockerfile saat ini
    • Wadah sementara itu akan memiliki volume anonim yang dipasang sebagai Anda atau gambar induk yang ditentukan di dalam Dockerfile
    • Volume anonim akan diinisialisasi dari isi gambar
  • Perintah Anda akan berjalan di dalam wadah
    • Jika Anda daftar direktori selama ini RUN perintah, Anda akan melihat perubahan Anda diterapkan, tetapi perubahan tersebut telah diterapkan ke volume
  • Ketika perintah run Anda selesai, docker akan menangkap perubahan pada wadah
    • Perubahan ini dapat dilihat dengan docker diff jika Anda tidak menghapus wadah sementara (Anda dapat menjalankan membangun dengan --rm=false untuk memiliki mereka tetap)
    • Perubahan ini tidak akan mencakup isi volume anonim karena mereka tidak ada di dalam filesystem kontainer sementara, volume terpisah

Karena perilaku ini, Anda memiliki pilihan untuk:

  1. Anda dapat menyalin file Anda ke direktori yang berbeda dan mengubah izin di sana
  2. Anda dapat memperbaiki izin pada host Anda sehingga mereka bisa disalin dengan izin tersebut secara langsung
  3. Anda dapat menghapus volume dari gambar Anda, mendapatkan gambar upstream untuk menghapus definisi volumenya, atau Anda dapat membangun kembali salinan gambar upstream Anda sendiri tanpa definisi volume dan mendasarkan gambar Anda dari itu

Perhatikan bahwa di dalam gambar php saat ini, tampak bahwa volume telah dihapus, yang berarti kita secara efektif memiliki opsi 3.

Saya baru saja melakukan percobaan dengan yang berikut:

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

Dan itu hanya karya besar.

Namun

Ketika saya mengganti file yang dapat dieksekusi melalui volume docker-compose, file execute izin hanya seperti digulung kembali - teknis mengesampingkan izin file asli.

Perbaikan untuk mode dev hanya untuk chmod a+x yourfile dari host, yang akan diwariskan pada volume compose pemasangan.

Oke … Saya mengedit pertanyaan :slight_smile:

Saya melihat ruang ekstra di perintah terakhir Anda (saya menggunakan ponsel saya, jadi saya tidak yakin). Karena masalah izin tampaknya ada pada direktori log, ubah baris terakhir menjadi: ``
Jalankan chmod-R 777 / var / www / html / aplikasi / cache / var / www / html / aplikasi / log

ruang ekstra itu salah ketik

Apakah Anda memecahkan masalah?

Saya tidak dapat mereproduksi masalah Anda. Jika saya menggunakan dockerfile Anda dan mengatur beberapa file dummy secara lokal, izin sudah benar dan semuanya berfungsi. Saya dapat mem-boot wadah dan mengakses konten melalui browser web. Dapatkah Anda memperbarui pertanyaan Anda untuk memasukkan pesan kesalahan tertentu? Apakah Anda yakin konfigurasi Apache anda (‘apache2.conf ’ ` tidak menyebabkan masalah? Apakah kesalahan pergi jika Anda tidak menginstal ’ apache2.conf’?

Akan sangat membantu untuk melihat perintah docker anda yang menjalankan gambar yang dibuat.