chmod tidak berfungsi dengan benar di Docker

18

Saya sedang membangun gambar Docker untuk Symfonyaplikasi saya dan saya perlu memberikan izin kepada server apache untuk menulis ke folder cache dan log

#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

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

Situasi

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

Gagasan, Apakah saya kehilangan sesuatu, mungkin saya harus menambahkan pengguna root di suatu tempat di Dockerfile?

badai
sumber
Akan sangat membantu untuk melihat perintah buruh pelabuhan Anda yang menjalankan gambar yang dibangun.
Mike
Saya melihat ruang ekstra di perintah terakhir Anda (saya di ponsel saya, jadi saya tidak yakin). Karena masalah izin sepertinya ada pada direktori log, ubah baris terakhir ke: `` `RUN chmod -R 777 / var / www / html / app / cache / var / www / html / app / log` ``
Mike
1
Oke .. saya mengedit pertanyaannya :)
storm
ruang ekstra itu adalah salah ketik
badai
Saya tidak dapat mereproduksi masalah Anda. Jika saya menggunakan dockerfile Anda dan mengatur beberapa file dummy secara lokal, izin sudah benar dan semuanya Hanya Bekerja. Saya dapat mem-boot wadah dan mengakses konten melalui browser web. Bisakah Anda memperbarui pertanyaan Anda untuk memasukkan pesan kesalahan tertentu? Apakah Anda yakin konfigurasi Apache Anda ( apache2.conf) tidak menyebabkan masalah? Apakah kesalahan hilang jika Anda tidak menginstal apache2.conf?
larsks

Jawaban:

15

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

Sebagai solusinya, Anda dapat menyalin sumber ke direktori sementara:

COPY . /src

Dan kemudian pindah ke /var/www/htmldan atur izin (dalam satu RUNperintah):

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

Saya juga membuat masalah GitHub .

mixel
sumber
Saya akan menggali kode sumber lama saya malam ini untuk melihat bagaimana saya menyelesaikan ini, kemudian saya ingat bahwa trik direktori tmp .. harap ini tidak membawa Anda banyak waktu untuk menyelesaikan XD
badai
7

Shell default RUN di Docker adalah / bin / sh dan ini adalah di mana izin yang tidak diatur dengan benar sebenarnya memiliki masalah.

Tetapi Anda dapat mengubah untuk hanya menggunakan / bin / bash sebagai gantinya untuk memperbaiki dengan mudah, perhatikan sebelum dan sesudah daftar direktori

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
Guidry Thad
sumber
2
Mengapa ini /bin/bash -c 'chmod +x file'berhasil dan tidak /bin/sh -c 'chmod +x file'?
badai
Anda adalah solusi yang lebih baik. itu berhasil untuk saya. terimakasih
user1427944
Juga, menggunakan buildkit baru membantu di sejumlah area termasuk yang ini. Cobalah. docs.docker.com/develop/develop-images/build_enhancements
Thad Guidry
6

Coba tambahkan:

USER root

Ini berhasil untuk saya.

secavfr
sumber
Ini harus menjadi jawaban yang diterima.
Vladimir Kornea
2
Jika Anda beralih ke root, Anda mungkin harus beralih kembali ke pengguna sebelumnya ketika Anda selesai atau Anda mengurangi keamanan dan kompatibilitas wadah. Beberapa implementasi Kubernet secara default tidak akan menjalankan wadah sebagai root misalnya.
flickerfly
2

Masalah ini kemungkinan merupakan hasil dari VOLUMEdefinisi di dalam Dockerfile hulu. Ketika volume didefinisikan dalam Dockerfile, Anda dapat menambahkan file dengan perintah COPYatau ADDlangsung ke dalam gambar. Namun, sebuah RUNbaris akan:

  • Buat wadah sementara menggunakan definisi gambar pada titik dockerfile saat ini
    • Wadah sementara itu akan memiliki volume anonim yang dipasang saat Anda atau gambar induk ditentukan di dalam Dockerfile
    • Volume anonim akan diinisialisasi dari isi gambar
  • Perintah Anda akan berjalan di dalam wadah
    • Jika Anda daftar direktori selama RUNperintah ini , Anda akan melihat perubahan Anda diterapkan, tetapi perubahan itu telah diterapkan ke volume
  • Ketika perintah jalankan Anda selesai, buruh pelabuhan akan menangkap perubahan ke wadah
    • Perubahan ini dapat dilihat dengan a docker diffjika Anda tidak menghapus wadah sementara (Anda dapat menjalankan build dengan --rm=falsemembuatnya tetap)
    • Perubahan ini tidak akan menyertakan konten volume anonim karena mereka tidak ada di dalam sistem file kontainer sementara, volume terpisah

Karena perilaku ini, Anda memiliki opsi untuk:

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

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

BMitch
sumber
0

Saya baru saja melakukan percobaan dengan yang berikut:

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

Dan itu bekerja dengan baik.

Namun

Ketika saya menimpa file yang dapat dieksekusi itu melalui volume docker-compose, executeizinnya seperti digulung kembali - secara teknis mengesampingkan ke izin file asli.

Perbaikan untuk mode dev hanya chmod a+x yourfiledari host, yang akan diwariskan pada penulisan volume pemasangan.

Salathiel Genèse
sumber
1
Seluruh tujuan volume adalah untuk me-mount file dari tempat lain selain gambar, jadi jika Anda memperbaiki gambar Anda dan me-mount volume di atas itu, secara desain Anda tidak akan melihat perubahan gambar Anda. Bergantung pada mengapa Anda memiliki volume, jawabannya mungkin tidak memiliki volume.
BMitch
Ya BMitch , saya sepenuhnya setuju untuk efek volume pemasangan yang mengesampingkan kontainer fs dari gambar docker built, tapi ... Selama pengembangan, Anda tentu tidak ingin membangun kembali / memulai ulang wadah Anda untuk menguji setiap dan setiap perubahan yang Anda lakukan melakukan. Dalam skenario terakhir ini apakah Anda ingin me-mount volume yang mengesampingkan buruh pelabuhan yang dibangun image fs. Dan saya menghadapi masalah yang sama sebelum mendarat di sini. Saya tidak dihukum dengan penjelasan jawaban dan menguji masing-masing. Hanya pada saat itulah saya mengerti apa yang terjadi dan memposting pengamatan saya ...
Salathiel Genèse
... dan saya curiga skenario yang saya alami sama dengan skenario dia yang mengajukan pertanyaan.
Salathiel Genèse
OP mengindikasikan mereka melihat masalah hanya dengan docker runperintah dan tidak ada volume eksternal yang terpasang.
BMitch
Oups - Saya melewatkan aspek itu ... Jawaban yang tepat untuk judul pertanyaan yang tepat, tetapi bukan skenario yang dijelaskan. Maka bolehkah saya menyebutkan bahwa saya tidak dapat mereproduksi masalah yang disebutkan di atas.
Salathiel Genèse