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
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):
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:
Anda dapat menyalin file Anda ke direktori yang berbeda dan mengubah izin di sana
Anda dapat memperbaiki izin pada host Anda sehingga mereka bisa disalin dengan izin tersebut secara langsung
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.
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.
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
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’?