Cara Mengatasi Error CodeIgniter 4 di Docker: Forbidden, .env Error, dan Cache Gagal Update (Fix Lengkap Buat Pemula!)

Kalo lu lagi baca artikel ini, kemungkinan besar lu sedang pusing tujuh keliling gara-gara CodeIgniter 4 error setelah dipindahin ke Docker.
Tenang ya, lu gak sendirian. Banyak yang CI4-nya mendadak ngamuk begitu masuk container. Gue juga pernah, dan rasanya pengen banting laptop

Tapi santai, kita beresin semuanya bareng-bareng.
Di tutorial santai ini kita bahas lengkap banget mulai dari:

  • Setup Dockerfile yang benar
  • Setup docker-compose
  • Fix Forbidden (403)
  • Fix InvalidArgumentException gara-gara .env
  • Fix error cache yang gak bisa update (yang paling ngeselin)

Pokoknya lengkap dan anti-bikin stress.
Oke, siap? Gaskeun bro.

1. Setup Dockerfile Paling Aman Buat CI4

Kita mulai dari dasar dulu. Dockerfile ini udah aman banget buat CI4 karena udah lengkap dependency-nya.

FROM php:8.2-apache

# Install tools + intl + GD dependencies
RUN apt-get update && apt-get install -y \
 zip unzip git libicu-dev libpng-dev libjpeg-dev libfreetype6-dev \
 && docker-php-ext-install mysqli pdo pdo_mysql intl

# Configure GD (jpeg + freetype)
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
 && docker-php-ext-install gd

# Enable Apache mod_rewrite
RUN a2enmod rewrite

# Set DocumentRoot ke public/
RUN sed -ri -e 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!/var/www/html/public!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- \
 --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www/html

Ini udah komplit banget buat CI4. Lu gak perlu mikirin ekstensi PHP lagi. Tinggal pakai. Kalau project kamu butuh ekstensi tambahan yang gak ada di daftar ini (misalnya untuk image processing lebih advanced atau koneksi ke database lain), tinggal tambahin baris docker-php-ext-install yang sesuai di Dockerfile, terus build ulang image-nya.

2. Setup docker-compose.yml

Compose-nya simple tapi wajib benar.

version: '3.8'

services:
  ci4-app:
    image: ci4:latest
    container_name: ci4-manajemen-vendor
    ports:
      - "5083:80"
    volumes:
      - GANTI LOKASI PROJEK CODEIGNITERMU DIMANA :/var/www/html
    working_dir: /var/www/html

Intinya folder proyek di-host di-mount ke container.
Apache di container akan baca file-file itu.

3. Install Composer di Dalam Container

Cara standar:

docker exec -it ci4-manajemen-vendor bash
composer install

Atau sekalian:

docker compose up -d
docker exec -it ci4-manajemen-vendor bash -c "composer install"

Kalau ada error ekstensi, santai aja. Dockerfile lu udah siap tempur.

4. Fix Error Forbidden (403)

Biasanya muncul begini:

Permission denied: AH00529: unable to check htaccess file

Penyebab utamanya simpel: permission folder lu di-host gak bisa dibaca Apache di container.

Cara fix:

docker exec -it ci4-manajemen-vendor bash
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html
exit

Akses ulang aman.

5. Fix InvalidArgumentException (Masalah .env)

Error ini muncul kalo:

  • File .env lu ilang
  • Lu rename .env jadi .bak
  • Atau formatnya salah parse

Solusi paling gampang adalah bikin file .env baru:

cp env.example .env

Habis itu CI4 langsung adem ayem lagi.

Kalau kamu commit file .env ke Git secara sengaja buat kebutuhan tim (padahal biasanya .env itu di-gitignore), pastikan juga versi .env.example selalu diupdate setiap kali ada environment variable baru yang ditambahin di .env, biar rekan tim yang baru clone project gak bingung env variable mana aja yang perlu diisi.

6. Fix Error Cache Unable to Write

Ini dia error yang paling sering dan paling ngeselin:

CacheException: Cache unable to write to "/var/www/html/writable/cache/"

Kenapa bisa gitu?

Karena folder writable yang nempel ke host itu pakai permission user host.
Sementara Apache dalam container jalan sebagai user www-data.
Akhirnya Apache gak dikasih izin buat edit.

Cara memperbaikinya:

A. Fix dari Host (cara paling bener)

sudo chown -R $USER:$USER /path/proyek/writable
sudo chmod -R 775 /path/proyek/writable

Atau buat testing:

sudo chmod -R 777 /path/proyek/writable

B. Fix dari Dalam Container

docker exec -it ci4-manajemen-vendor bash
chmod -R 777 writable
exit

Habis itu refresh auto sembuh.

Langkah perlindungan ke depannya

Agar permission tidak bikin Git error lagi:

git config core.fileMode false

Bonus: Error “500 Internal Server Error” Blank Page

Kadang muncul juga kasus halaman blank putih doang tanpa pesan error jelas, cuma status 500. Ini biasanya karena display_errors di PHP dimatiin secara default di image production-like. Buat debugging sementara, masuk ke container dan cek log Apache langsung:

docker exec -it ci4-manajemen-vendor bash
tail -f /var/log/apache2/error.log

Dari situ biasanya langsung ketauan akar masalahnya, entah itu extension PHP yang belum keinstall, syntax error, atau masalah permission yang belum kebahas di atas. Selain itu, pastikan juga CI_ENVIRONMENT di file .env di-set ke development pas lagi proses debug, biar CodeIgniter nampilin detail error di browser, bukan cuma halaman blank.

Penutup

Nah bro, sekarang CodeIgniter 4 lu udah bisa jalan mulus di Docker tanpa drama lagi.
Dari forbidden, error .env, sampai cache yang gak mau update, semuanya udah kita sikat satu-satu.

Semoga artikel santai ini bisa bantu lu yang lagi pusing sama CI4 + Docker.
Kalo ada error yang lebih aneh lagi, tinggal panggil aja. Kita oprek bareng sambil ngopi santuy.

Sampai ketemu di tutorial berikutnya bro. Tetap semangat ngoding, tapi jangan lupa hidup juga ya

Jundi Husni Mubaraq

Jundi Husni Mubaraq

Saya seorang software engineer yang sejak awal 2026 megang penuh (sendirian) tanggung jawab infrastruktur server di tempat saya kerja: deploy dan maintain server Linux Ubuntu on-premises, bangun keamanan berlapis pakai CrowdSec dan Cloudflare, kelola job scheduling dan monitoring pakai Cronicle, deploy aplikasi containerized pakai Docker, sampai ngurusin mail server korporat dari nol. Sebelumnya saya 3+ tahun jadi Software Engineer/Fullstack Developer di beberapa perusahaan, termasuk proyek skala internasional (EUDR compliance system buat Lindt & Sprungli) dan sistem rumah sakit (SIMRS, rekam medis elektronik, integrasi BPJS Kesehatan) di RS PKU Muhammadiyah Surakarta. jundi.hm ini tempat saya dokumentasiin apa yang beneran saya kerjain dan pelajarin di lapangan, bukan sekadar riset teori, S.Kom dari Universitas Duta Bangsa Surakarta jadi bekal awal, tapi yang nulis di sini adalah pengalaman langsung ngelola server production sehari-hari. Selengkapnya: https://iam.jundi.hm

Lihat Juga Nih

Selanjutnya Nih

Kasih Komentar

Email kamu gak bakal ditampilin ke publik. Kalau ada tanda ini artinya wajib diisi ya *

Rekomendasi.

Lagi Viral.