Menyalin file ke container dengan Docker Compose

94

Saya memiliki Dockerfiletempat saya menyalin direktori yang ada (dengan konten) ke wadah yang berfungsi dengan baik:

Dockerfile

FROM php:7.0-apache
COPY Frontend/ /var/www/html/aw3somevideo/
COPY Frontend/ /var/www/html/

RUN ls -al /var/www/html
RUN chown -R www-data:www-data /var/www/html 
RUN chmod -R 755 /var/www/html 

Tangkapan layar dari daftar direktori dengan eksekutif buruh pelabuhan

Tetapi ketika saya menggunakan docker-compose.ymlfile hanya ada direktori aw3somevideodan di dalamnya aw3somevideotidak ada.

docker-compose.yml :

 php:
    build: php/
    volumes:
      - ./Frontend/ :/var/www/html/
      - ./Frontend/index.php :/var/www/html/
    ports:
      - 8100:80

Tangkapan layar dari daftar direktori kosong

Mungkin saya tidak mengerti fungsi dari volumesdan jika demikian kasusnya tolong beritahu saya bagaimana cara menyalin file saya yang ada ke kontainer melalui sebuah docker-compose.ymlfile.

Dokter
sumber
4
Hapus volumes:bagian Anda dari file docker-compose Anda. Gambar Anda sudah memiliki datanya. Volume: bagian hanya menimpa data. Juga pindah ke format penulisan buruh pelabuhan saat ini (versi 2).
Bernard
@Alkaline thx itu benar-benar masalahnya. Tetapi mengapa volume tidak menyalin seluruh direktori?
TheDoctor
Saya akan membalas sebagai jawaban sehingga Anda menutup masalah ini.
Bernard

Jawaban:

80

Diberikan

    volumes:
      - /dir/on/host:/var/www/html

jika /dir/on/hosttidak ada, itu dibuat di host dan konten kosong dipasang di penampung di /var/www/html. Konten apa pun yang Anda miliki sebelumnya di /var/www/htmldalam wadah tidak dapat diakses, sampai Anda melepaskan volumenya; mount baru menyembunyikan konten lama.

Bernard
sumber
Apakah mungkin, bahwa dengan versi buruh pelabuhan terbaru konten var/www/html/tidak disalin lagi /dir/on/hostbahkan ketika itu tidak ada? Apakah ada cara untuk menyalin paksa data dari dalam docker-container ke host saat memulai container untuk pertama kali?
Tarator
1
@Tarator ya memang, sisi kanan tidak disalin ke host lagi. Saya akan memperbarui jawabannya. Adapun cara untuk menyalin pada container start, Anda dapat mengganti perintah startup dengan sesuatu seperti ini docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp". Jangan lupa gunakan execuntuk memanggil perintah terakhir agar diberi PID1. Itu akan memastikan bahwa myapp menerima sinyal penghentian (Ctrl-C misalnya).
Bernard
Hai, Saya juga mencoba melakukan hal yang sama dengan docker-compose tetapi mendapatkan kesalahan, Bisakah Anda melihatnya ... stackoverflow.com/questions/45573831/…
utkarsh31
Hei, Bernard, dalam jawaban Anda, Anda mengacu pada " apakah sisi kanan menentukan volume bernama seperti volume saya atau jalur pada host" . Bukankah yang Anda maksud adalah "tangan kiri" di sana, karena di situlah seseorang menunjuk baik volume atau jalur host, yang kemudian dipetakan ke lokasi kontainer di rhs? Saya menyadari Anda sedang berbicara tentang bagaimana Docker dapat mengelola penyalinan file antara kiri dan kanan, dan bagaimana itu berubah.
Charlie Arehart
@arliearea Anda benar. Saya akan memperbaiki kesalahan itu sekarang.
Bernard