Analisis Masalah Docker: Mengapa Aplikasi Error Jika Folder 'vendor' Tidak Dinaikkan Penyebab utama mengapa aplikasi PHP (seperti Laravel) di dalam Docker menjadi error ketika folder 'vendor' tidak diikutsertakan (tidak dinaikkan/di-upload), sangat berkaitan dengan cara kerja Composer dan konfigurasi Volume Mount pada Docker. Berikut adalah analisa lengkapnya: 1. Folder 'vendor' Berisi Core Aplikasi dan Dependensi (Akar Masalah) Pada aplikasi PHP modern, folder 'vendor' adalah nyawa dari aplikasi tersebut. Folder ini tidak hanya berisi library pihak ketiga, tetapi juga berisi core framework (misalnya Laravel/Symphony) dan file autoload.php. Jika folder 'vendor' tidak ada, baris kode pertama di aplikasi Anda (biasanya di public/index.php yang memanggil require __DIR__.'/../vendor/autoload.php';) akan gagal dieksekusi dan menghasilkan Fatal Error: Failed to open stream. 2. Efek "Timpaan" Volume Mount di docker-compose.yml Berdasarkan file docker-compose.yml Anda, terdapat konfigurasi volume mount: volumes: - .:/var/www/html Ini adalah penyebab spesifik di environment Docker. - Di dalam Dockerfile, Anda sebenarnya sudah menjalankan 'composer install' (pada baris ke-62), yang artinya Docker sudah susah payah membuat folder 'vendor' di dalam image Docker. - Namun, saat container dijalankan melalui docker-compose, baris 'volumes: - .:/var/www/html' memerintahkan Docker untuk menimpa (overwrite/mount) isi /var/www/html di dalam container dengan folder '.' (folder lokal Anda) dari host. - Akibatnya: Jika di folder lokal Anda (host/server) tidak ada folder 'vendor' (karena tidak ikut dinaikkan), maka folder 'vendor' yang ada di dalam image Docker akan "tertutup" atau menghilang karena tergantikan oleh isi folder lokal Anda yang kosong tanpa 'vendor'. 3. Mengapa entrypoint.sh Gagal Menyelamatkan? Anda mungkin bertanya, "Tapi kan di entrypoint.sh ada perintah composer install, kenapa tetap error?" Secara teori, skrip entrypoint.sh Anda sudah dirancang dengan baik untuk melakukan fallback (otomatis install jika vendor hilang). Namun, seringkali hal ini gagal di environment production karena: - Timeout / Jaringan: Mengunduh ratusan package Composer saat container baru start sering mengalami timeout atau gagal karena batas waktu. - Limit RAM (Out of Memory): Menjalankan composer install membutuhkan RAM yang cukup besar. Seringkali server VPS mengalami OOM (Out Of Memory) / Killed saat proses berjalan. - Masalah Permission: Karena entrypoint.sh biasanya dijalankan oleh user root Docker, folder 'vendor' yang tercipta mendadak akan berstatus owner: root. Ketika server web (php-fpm / nginx yang menggunakan user www-data) mencoba membaca file tersebut, aksesnya ditolak (Permission Denied). ======================================================= SOLUSI YANG DIREKOMENDASIKAN ======================================================= Tergantung pada tujuan Anda (Production vs Development lokal): [A] Jika untuk Production / Server VPS (Rekomendasi Utama) Jangan gunakan bind mount seluruh source code di production. Hapus atau beri komentar pada baris volume utama di docker-compose.yml: volumes: # - .:/var/www/html <-- Matikan/hapus baris ini untuk production - ./entrypoint.sh:/entrypoint.sh Dengan menghapus baris ini, Docker akan murni menggunakan kode dan folder 'vendor' yang sudah ter-build secara permanen di dalam image (hasil dari Dockerfile), sehingga Anda tidak perlu menaikkan folder 'vendor' dari lokal Anda sama sekali. [B] Jika untuk Local Development Anda memang disarankan untuk menggunakan volume mount agar bisa live reload saat mengedit kode. Namun, Anda harus memastikan sinkronisasi 'vendor': 1. Jalankan 'composer install' terlebih dahulu di lokal Anda sebelum menjalankan docker, ATAU 2. Jalankan dari dalam container agar foldernya terbuat dan memantul ke luar (ke host Anda): docker exec -it kulakpos_app composer install