Jika file yang seharusnya berasal dari image Anda menghilang setelah docker compose up di macOS, periksa apakah bind mount menutupi direktori kontainernya. Bind mount membuat konten folder host terlihat di target mount, sehingga mengaburkan file yang sudah ada di dalam image. Temukan pemetaan spesifiknya, perbaiki path host atau kontainernya—atau hapus jika tidak diperlukan—dan buat ulang layanan yang terpengaruh. Docker mendokumentasikan bahwa membuat ulang kontainer tanpa mount tersebut adalah cara untuk memunculkan kembali file asli milik image. (Bind mounts)
Mengapa bind mount menyembunyikan file
Bind mount menghubungkan sebuah path di host ke sebuah path di dalam kontainer. Sebagai contoh, me-mount ./app:/usr/src/app membuat folder app di host muncul di /usr/src/app. Jika image sudah berisi file di lokasi tersebut, file-file tersebut tetap menjadi bagian dari image namun tersembunyi selama mount aktif. Hal ini dapat membuat image yang berfungsi tampak kosong atau menyebabkan error saat memulai (startup) ketika program yang diharapkan tertutupi. Perilaku yang sama juga berlaku di Mac; Docker Desktop menjembatani akses file host melalui mesin virtual Linux miliknya. (Bind mounts)
Ini berbeda dari masalah izin file (file permission): kontainer mungkin dapat membaca direktori yang di-mount dengan benar, tetapi kontainer tersebut membaca kumpulan file yang berbeda dari direktori milik image. Periksa pemetaannya sebelum mengubah kepemilikan (ownership) atau membuat ulang (rebuild) image.
Menemukan pemetaan di file Compose Anda
Buka file Compose yang digunakan untuk menjalankan proyek dan temukan entri volumes: pada layanan yang terpengaruh. Entri bentuk pendek (short-form) seperti ./app:/usr/src/app adalah bind mount jika sumbernya (source) berupa path host. Di Compose lokal, path sumber relatif diselesaikan dari direktori induk file Compose. Artinya, ./app mungkin merujuk ke folder yang berbeda dari yang Anda harapkan jika file Compose berada di dalam subdirektori. (Compose services reference)
Untuk melihat konfigurasi yang telah diselesaikan dan status layanan, jalankan perintah ini dari direktori proyek di Terminal macOS:
docker compose config
docker compose ps
Pada konfigurasi yang ditampilkan, bandingkan source setiap mount (path Mac) dengan target-nya (path kontainer). Kemudian bandingkan target tersebut dengan direktori kerja (working directory) image dan direktori tempat file aplikasi diharapkan berada. Mount yang luas seperti .:/usr/src/app dapat menutupi seluruh direktori aplikasi; pemetaan yang lebih spesifik seperti ./config:/usr/src/app/config membiarkan sisa direktori image tetap terlihat.
Memilih perbaikan yang tepat
Jika layanan memerlukan akses langsung ke kode sumber (source code), pertahankan bind mount tetapi arahkan ke folder host yang benar dan subdirektori kontainer yang dituju. Pastikan bahwa direktori host berisi file yang Anda harapkan. Sintaks pendek Compose membuat direktori baru jika sumber bind tidak ditemukan, sehingga kesalahan ketik (typo) dapat secara tak sengaja memberikan folder kosong ke kontainer. Untuk kontrol yang eksplisit, gunakan sintaks panjang dengan create_host_path: false; Compose kemudian akan melaporkan sumber yang hilang alih-alih membuat direktori baru. (Compose services reference)
services:
app:
volumes:
- type: bind
source: ./app
target: /usr/src/app
bind:
create_host_path: false
Jika image seharusnya menyediakan file aplikasi, hapus mount yang menargetkan direktori tersebut. Jika hanya konfigurasi atau satu folder yang dihasilkan yang memerlukan akses host, mount subdirektori itu saja. Untuk data kontainer persisten seperti database, pertimbangkan untuk menggunakan named volume: Docker mengelola penyimpanannya, dan ini menghindari keterikatan data tersebut ke direktori Mac tertentu. (Volumes)
Membuat ulang layanan dan memverifikasi
Setelah mengedit file Compose, buat ulang layanan yang terpengaruh agar menggunakan konfigurasi mount yang diperbarui. Ganti app di bawah ini dengan nama layanan dari file Anda:
docker compose up -d --force-recreate app
docker compose exec app sh -c 'ls -la /usr/src/app'
Perintah ls memeriksa apa yang dapat dilihat kontainer pada target; ubah path jika layanan Anda menggunakan lokasi yang berbeda. Jika image tidak memiliki shell atau tidak memiliki perintah ls, periksa log startup-nya dengan docker compose logs app dan gunakan perintah diagnostik yang tersedia di image tersebut. Docker juga mendokumentasikan docker inspect untuk memeriksa sumber dan tujuan mount kontainer; dengan Compose, pertama-tama dapatkan nama kontainernya dari docker compose ps, lalu jalankan docker inspect CONTAINER_NAME. (Bind mounts)
Jika sumber berada di luar folder bersama (shared folders) Docker Desktop, atau Anda melihat Mounts denied atau file is not shared from the host, periksa Settings > Resources > File sharing di Docker Desktop dan tambahkan direktori Mac yang spesifik. Docker mencantumkan /Users, /Volumes, /private, /tmp, dan /var/folders sebagai folder bersama secara default, tetapi direktori di luar lokasi tersebut mungkin perlu ditambahkan. Docker VMM tidak mendukung pembagian otomatis (auto-shares) bind mount, jadi menambahkan direktori secara manual diperlukan untuk backend tersebut. (Docker Desktop settings, Virtual Machine Manager)
Mount yang menyembunyikan file image biasanya diperbaiki dengan mengoreksi sumber atau targetnya, mempersempit cakupannya, atau menghapusnya dan membuat ulang layanan tersebut. Pertahankan bind mount jika kontainer memerlukan folder host tertentu; jika tidak, biarkan image menyediakan filenya sendiri atau simpan data persisten di volume yang dikelola Docker.
Sumber
Bind mounts — Docker Docs
Define services in Docker Compose — Docker Docs
Change your Docker Desktop settings — Docker Docs
Virtual Machine Manager — Docker Docs
Volumes — Docker Docs