Compose: copy file atau direktori docker-compose ke container

Dibuat pada 1 Jan 2018  ·  141Komentar  ·  Sumber: docker/compose

kami kehilangan kemungkinan untuk menyalin file atau direktori menggunakan docker-compose. Saya merasa ini sangat berguna.
Silakan periksa banyak +1 di prematur ditutup https://github.com/docker/compose/issues/2105

kinfeature statu0-triage

Komentar yang paling membantu

Apa gunanya memaksakan secara dogmatis itu antipattern, hanya karena dalam _some_ kasus itu bisa _kemudian_ menyebabkan masalah? Ini pasti memiliki kegunaan yang baik karena Anda dapat menambahkan satu baris ke file yang ada, daripada harus membuat folder dan file tambahan, lalu memindahkan file untuk ditambahkan ke sana. Pembuatan file kecil yang birokratis dan tidak berguna ini adalah antipattern yang nyata, mencegah pengguna membuat file yang dibuat secara sederhana dan mudah dikelola oleh buruh pelabuhan.

Jika pengguna ingin melakukan hal-hal berbahaya dengan Docker, mereka akan menemukan cara apa pun yang Anda lakukan. Menolak untuk menambahkan fitur yang sah hanya karena seseorang mungkin menyalahgunakannya suatu hari nanti adalah tindakan bodoh.

Semua 141 komentar

Apa usecase itu? Sebagian besar penggunaan yang disarankan yang pernah saya lihat adalah antipattern.

Anda dapat melihat beberapa dari banyak kasus penggunaan dengan mengklik link yang tersedia. Seperti yang Anda lihat, banyak pelanggan menganggapnya sebagai fitur yang sangat berguna daripada "antipattern"

Ups, sekarang saya melihat "sesuatu" terjadi pada masalah # 2105 karena tidak ada komentar sama sekali ...
Mungkin saya memberikan tautan yang salah ...

jadi, saya merasa sangat berguna untuk menyalin beberapa file konfigurasi / inisialisasi ke container. Sebagai contoh beberapa item * .sql untuk container db, beberapa konten html / js / css untuk container apache / nginx atau bahkan file jar untuk container java. Ini akan membuatnya tersedia / dapat dijalankan "secara global" tidak hanya pada mesin di mana ia dibuat seperti dalam kasus volume pemasangan. Terutama ini akan menjadi beberapa kombinasi file yang berisi host-lokal dan kontainer. Faktanya, wadah apa pun dapat dianggap tidak berguna tanpa konfigurasi atau inisialisasi apa pun

ini adalah tautan yang benar: https://github.com/docker/compose/issues/1664

+1

Ini akan membuatnya tersedia / dapat dijalankan "secara global" tidak hanya di mesin tempat ia dibuat seperti dalam kasus volume pemasangan

Masalah dengan ini adalah bahwa hal ini sangat berpandangan pendek (karena itu disebut "anti-pola"), karena akan memaksa Anda untuk mengulangi operasi setiap kali kontainer dibuat ulang. Belum lagi fakta bahwa skalanya sangat buruk (bagaimana jika Anda memiliki 10 kontainer? 20? 100?)

Solusi sebenarnya untuk masalah Anda adalah menyertakan file-file yang diperlukan tersebut dalam build Anda (Dockerfile) dan membangun kembali saat pembaruan diperlukan.

tentu saja, jika itu disusun termasuk semua konten yang "dibagikan" ke dalam wadah, penskalaan 10-20-100- kontainer akan jauh lebih mudah. Semua yang Anda butuhkan adalah menariknya dari repositori dan me-mount (ya, dalam hal ini mount) hanya konfigurasi khusus node. Dan terlebih lagi, Anda tidak perlu menjalankan docker-compose di setiap node.
Tentu kita dapat menggunakan docker-compose dalam kombinasi dengan build: & Dockerfile, namun hal-hal menjadi sedikit lebih kompleks dan konfigurasi yaml di docker-compose jauh lebih "elegan": o)

Saya mengalami masalah di mana salinan akan berguna (setidaknya sebagai pengganti). Saya kebanyakan mengembangkan di mac jadi saya hampir tidak pernah melihat masalah dengan perintah yang berjalan sebagai root di wadah dan mengekspor ke volume yang terpasang. Namun, baru-baru ini menggunakan alur kerja yang sama pada CentO telah menyebabkan beberapa masalah besar karena file yang dimiliki oleh pengguna root ditambahkan ke host melalui volume yang dipasang. Saya ingin dalam kasus ini hanya dapat menyalin file host ke penampung alih-alih memasangnya.

Masalah terkait: # 1532

memperbarui

Saya pikir dalam kasus saya, saya bisa lolos dengan menggunakan COPY di Dockerfile dan memiliki beberapa file docker-compose yang salah satunya menggunakan volume mount.

Kasus penggunaan:
Saya ingin menggunakan direktori dari sistem file read-only di dalam container. Aplikasi membuat file baru di direktori itu, tetapi karena filesystem hanya bisa dibaca, ini menyebabkan kesalahan.

Saya tidak dapat menggunakan volume rw, karena filesystem hanya dapat dibaca.
Saya tidak bisa menggunakan volume ro, karena efeknya akan sama.

Akan sangat luar biasa untuk membuat penulisan yang dipertahankan hanya saat container berjalan. Saya dapat membuat pembungkus (https://stackoverflow.com/questions/36362233/can-a-dockerfile-extend-another-one) menjadi hanya COPY file, tetapi membuatnya dalam bentuk tulisan, mirip dengan volume , akan lebih baik

Kasus penggunaan: memulai beberapa kontainer buruh pelabuhan secara bersamaan dari .gitlab-ci.yml yang perlu menulis ke direktori repositori git.

Jika proses di dalam container gagal atau jika ci job dibatalkan sebelum container dibersihkan setelahnya, file yang tersisa tidak dapat dihapus oleh gitlab-runner karena kurangnya izin. Sekarang saya dapat menyalin file di dalam wadah dari volume ke direktori lain, tetapi itu akan menjadi antipattern, bukan?

Apakah ini berbeda dari volumes: - ./folder_on_host/ :/folder_in_container/ ?
Saya dapat menyalin file dari host ke penampung (setara dengan COPY) dengan cara ini di file buat saya

@harpratap Anda benar, tetapi kekurangannya adalah / folder_in_container tidak boleh ada atau harus kosong atau akan ditimpa. Jika Anda memiliki skrip bash sebagai titik masuk Anda, Anda dapat menghindari ini dengan menghubungkan file Anda ke direktori yang dimaksudkan semula setelah Anda membuat volume di / some_empty_location

1 untuk memiliki fungsi SALIN. Kasus penggunaan kami adalah untuk cepat berdiri di lingkungan pengembangan lokal dan menyalin konfigurasi untuk pengaturan dev.

1 untuk COPY. Ini akan menjadi fitur yang sangat membantu.

Kasus penggunaan: dalam mode swarm, saya memiliki layanan yang menggunakan gambar mysql. Saya perlu menyalin skrip inisialisasi saya di /docker-entrypoint-initdb.d/ agar MySQL dapat menjalankannya.

Meskipun dimungkinkan untuk membuat gambar di atas mysql, salin file dan gunakan atau sambungkan ke mysql
tugas dalam gerombolan dan kemudian menjalankan skrip secara manual, itu agak tidak perlu menurut saya.

1 untuk SALIN / TAMBAH,

Kasus Penggunaan:
Fluentd memerlukan file konfigurasi untuk dipindahkan ke penampung selama waktu proses. File konfigurasi ini dibuat saat dijalankan oleh Jenkins Engine kami dan tanpa COPY / ADD dalam pembuatan buruh pelabuhan, file tersebut gagal.

1 untuk COPY

Misalkan seseorang memiliki file konfigurasi bersama di sejumlah mesin buruh pelabuhan, dengan Dockerfiles mereka di masing-masing subdirektori di bawah direktori tulis-buruh pelabuhan. Bagaimana Anda menyalin konfigurasi bersama itu ke dalam setiap gambar? Saya tidak dapat menautkan secara simbolis ke ../ dari konteks Dockerfile tanpa mendapatkan COPY failed: Forbidden path outside the build context

Dalam contoh ini saat menjalankan build docker-compose, saya ingin menyalin file config dari konteks docker-compose sebelum menjalankan langkah-langkah pembuatan docker.

Saya senang jika seseorang dapat menyarankan solusi yang bersih tentunya.

Ini akan menyenangkan memiliki fitur !!

Tolong jangan berkomentar hanya dengan +1 - ini membuang-buang waktu semua orang. Jika Anda memiliki informasi tambahan untuk diberikan, lakukanlah; jika tidak, tambahkan saja jempol ke masalah aslinya.

Apa gunanya memaksakan secara dogmatis itu antipattern, hanya karena dalam _some_ kasus itu bisa _kemudian_ menyebabkan masalah? Ini pasti memiliki kegunaan yang baik karena Anda dapat menambahkan satu baris ke file yang ada, daripada harus membuat folder dan file tambahan, lalu memindahkan file untuk ditambahkan ke sana. Pembuatan file kecil yang birokratis dan tidak berguna ini adalah antipattern yang nyata, mencegah pengguna membuat file yang dibuat secara sederhana dan mudah dikelola oleh buruh pelabuhan.

Jika pengguna ingin melakukan hal-hal berbahaya dengan Docker, mereka akan menemukan cara apa pun yang Anda lakukan. Menolak untuk menambahkan fitur yang sah hanya karena seseorang mungkin menyalahgunakannya suatu hari nanti adalah tindakan bodoh.

Saya pikir apa yang Anda lakukan sebenarnya adalah cara yang benar untuk melakukannya, dalam hal ini.

Masalah di sini yang diangkat lebih seperti, misalkan file mongo.conf dibagikan antara tiga gambar buruh pelabuhan yang diatur oleh satu file tulis-buruh pelabuhan. Bagaimana Anda memastikan bahwa itu sama di setiap subdirektori build docker?

Jika Anda menggunakan link simbolik misalnya, pekerja galangan mengeluh bahwa file tersebut berada di luar lingkungan build, misalnya build docker tidak memiliki rasa reproduktifitas karena modifikasi di luar direktori tersebut dapat mengubah build.

Jadi satu-satunya cara untuk mengatur ini adalah dengan menyalin file, yang saat ini perlu dilakukan dengan Makefile atau skrip shell sebelum menjalankan pembuatan-galangan, jadi sepertinya ide untuk mendiskusikan apakah ini adalah fitur yang dapat dibuat oleh pekerja galangan. lakukan, karena pasti itu kasus penggunaan umum.

Masalah yang Anda angkat tampaknya lebih banyak tentang injeksi runtime (waktu peluncuran) dari modifikasi file lokal.

Saya pikir Anda benar-benar baik-baik saja dengan apa yang Anda lakukan, apa yang Anda katakan di atas hanyalah bagaimana melakukannya. Gambar buruh pelabuhan selalu dapat dibangun untuk menerima variabel lingkungan untuk menjawab pertanyaan seperti di mana direktori config, dan direktori config itu dapat "disuntikkan" menggunakan volume saat runtime - tetapi itu tergantung pada desain gambar buruh pelabuhan, memanfaatkan variabel lingkungan dan pemetaan volume (yang merupakan fitur yang didukung buruh pelabuhan sebagai modifikasi konfigurasi runtime.)

Saya harap saya tidak salah menafsirkan komentar Anda, dan balasan saya bermanfaat.

@jpz - Entah bagaimana saya menghapus komentar asli saya - astaga - maaf! Terima kasih - ya, itu membantu.

Komentar asli saya adalah:

Kasus penggunaan saya adalah saya ingin mendeklarasikan layanan menggunakan mongo tanpa harus membuat gambar kustom sendiri hanya untuk menyalin file konfigurasi seperti /etc/mongod.conf .

UPDATE: Saya menggunakan volumes . Satu atau dua tahun yang lalu - Saya pikir saya telah mencoba ini dengan pengalaman buruk ... tetapi tampaknya baik-baik saja.

1 untuk COPY

Saya membuat intisari singkat untuk ini. Ini mengasumsikan layanan penulisan buruh pelabuhan bernama phpfpm , namun Anda dapat mengubahnya menjadi apa pun yang Anda inginkan. silakan memodifikasi.
https://gist.github.com/markoshust/15efb29aa5eebf8adae402af18b2e674

Halo, saya ingin tahu bagaimana kemajuan masalah ini. Sekarang, saya menggunakan windows 10 home dengan docker-toolbox. Tampaknya sebagian besar error ketika saya mencoba memasang file sebagai volume ke dalam container. Sangat menyenangkan memiliki kemampuan COPY dalam pembuatan-galangan

COPY / ADD pasti akan menjadi fitur sambutan.

Kasus penggunaan: menjalankan instance Graylog di Docker untuk tujuan Dev. Untuk meluncurkan input secara otomatis, spesifikasi JSON harus diletakkan di / usr / share / graylog / data / contentpacks
Dengan fitur SALIN / TAMBAH, ini akan menjadi semudah satu baris di YML.

Untuk membuatnya berfungsi sekarang (pada 16 Oktober 2018), perlu memasang volume ke titik itu DAN menyalin konten asli folder itu ke volume yang persisten. Yang cukup merepotkan.

Saya akan mendapatkan keuntungan dari itu, saya memiliki seperangkat alat yang mengimpor benih database ke dalam wadah dan kemudian saya menjalankan importir database devtools berdasarkan file itu. Saya tidak ingin melakukan:

docker cp "${seed_file}" $(docker-compose ps -q devtools):/tmp/seed_file

untuk dapat mengimpor benih saya. Dan tidak, saya tidak akan mengkompilasi gambar dev saya dengan skema tetap, ini paling tidak bertentangan dengan pola pengembangan web. Penampung harus untuk portabilitas aplikasi, bukan untuk data.

Akan lebih masuk akal untuk melakukan:

docker-compose cp "${seed_file}" devtools:/tmp/seed_file

Semua dalam semua, itu hanya tangan pendek yang pada dasarnya melakukan hal yang sama, tetapi terlihat lebih baik untuk memanfaatkan docker-compose mana-mana daripada mencampur barang ...

1) ini tampaknya merupakan duplikat dari # 3593
2) saya setuju dengan @ shin- bahwa kasus penggunaan yang diuraikan mengikuti pola anti
3) tetapi membungkus perintah Docker cp masuk akal, imo

@funkyfuture Jika menurut Anda kasus penggunaan ini mengikuti antipattern, mohon sarankan solusi yang tidak.

Bagaimana dengan "bagian data" seperti k8s ?
Sebagai contoh:

services:
  service1:
    image: image.name
    data:
      filename1.ini: |
        [foo]
        var1=val1
        [bar]
        var2=val2
      filename2.yml: |
        foo:
          bar: val1

atau mungkin sama tetapi untuk bagian volumes:

volumes:
  service_config:
    data:
      filename1.ini: |
        [foo]
        var1=val1
        [bar]
        var2=val2

services:
  service1:
    image: image.name
    volumes:
      - service_config:/service/config

@ shin-

Masalah dengan ini adalah bahwa hal ini sangat berpandangan pendek (karena itu disebut "anti-pola"), karena akan memaksa Anda untuk mengulangi operasi setiap kali kontainer dibuat ulang. Belum lagi fakta bahwa skalanya sangat buruk (bagaimana jika Anda memiliki 10 kontainer? 20? 100?)

Masalah sebenarnya di sini adalah bahwa beberapa orang terlalu cepat menolak fitur yang diminta karena bertentangan dengan visi terbatas mereka tentang skenario kasus penggunaan yang sebenarnya.

Di sini saya mencari cara untuk menyalin file konfigurasi saya ke dalam wadah yang baru saja saya dapatkan dari dockerhub. Saya tidak memiliki akses ke Dockerfile asli dan akan sangat mudah untuk memiliki fitur ini, (daripada mencoba membangun lapisan lain di atas, yang akan berfungsi, tetapi tidak nyaman, saya tidak ingin membangun kembali ketika saya mengubah sesuatu).

Kasus penggunaan:

Saya menjalankan database dalam lingkungan uji integrasi dan ingin data disetel ulang pada setiap iterasi, saat wadah dimulai. Menyematkan data dalam gambar khusus akan berfungsi, tetapi memasang volume tidak praktis - karena data pada host harus disetel ulang.

Kami memelihara data secara independen dan akan lebih mudah jika hanya menggunakan gambar database standar - menyalin data ke dalamnya sebelum mulai berjalan. Saat ini, tampaknya hal ini tidak mungkin dilakukan dengan docker-compose.

Saya sedang memikirkan kasus penggunaan. Saya ingin mendasarkan gambar saya dari gambar di luar rak, seperti server Apache generik. Saya ingin menyalin html saya selama pembuatan gambar. Dengan cara itu saya dapat memperbarui gambar dasar saya kapan pun saya mau dan petunjuk penyalinan akan memastikan konten saya disertakan dalam gambar baru.

BTW Saat ini saya menggunakan dockerfiles dan membangun direktif di docker-compose.yaml saya untuk melakukan ini. Akan lebih baik jika saya tidak membutuhkan file buruh pelabuhan.

@tvedtorama -

Kasus penggunaan:

Saya menjalankan database dalam lingkungan uji integrasi dan ingin data disetel ulang pada setiap iterasi, saat wadah dimulai. Menyematkan data dalam gambar khusus akan berfungsi, tetapi memasang volume tidak praktis - karena data pada host harus disetel ulang.

Kami memelihara data secara independen dan akan lebih mudah jika hanya menggunakan gambar database standar - menyalin data ke dalamnya sebelum mulai berjalan. Saat ini, tampaknya hal ini tidak mungkin dilakukan dengan docker-compose.

Masalah ini membahas keinginan untuk menyalin file pada waktu pembuatan gambar, bukan pada waktu proses. Saya akan menyarankan untuk menaikkan tiket terpisah untuk membahas manfaat itu? Mungkin membingungkan diskusi ini untuk menyimpang membahas injeksi file runtime (yang saya tafsirkan apa yang Anda bicarakan.)

@ c0ze -

Bagaimana dengan "bagian data" seperti k8s ?
Sebagai contoh:

...

Saya tidak sepenuhnya memahami apa yang dilakukan konfigurasi itu, tapi ya, sepertinya itu akan menjadi solusi. Pada dasarnya ketika Anda memiliki rahasia (misalnya apa nama pengguna login / pwd / port ke database), bagaimana cara menyuntikkannya ke gambar buruh pelabuhan saya - klien dan server - tanpa menulis beban kode?

Sesuatu seperti kubernetes data section dapat berfungsi - karena ini akan menjadi sumber tunggal kebenaran. Jika tidak, orang mungkin menemukan mereka memiliki rahasia yang sama yang dipertahankan beberapa kali di beberapa gambar buruh pelabuhan.

Ada juga prior art di sana, yang membantu mengarahkan percakapan ke apakah ini benar-benar ide yang bagus untuk diadopsi atau tidak.

Bagi saya, ini semua dimulai dengan keinginan untuk berbagi file konfigurasi invarian di seluruh kontainer, dan menyadari bahwa tidak ada cara untuk melakukannya tanpa membuat skrip secara eksternal ke docker-compose, dan menulis konfigurasi dari satu-sumber-kebenaran ke masing-masing folder Docker di bawah folder tulis-buruh pelabuhan. Tentu saja saya mendapatkan argumen kekekalan untuk Docker (misalnya direktori Dockerfile menjelaskan secara lengkap dan lengkap bagaimana membangun image) jadi meminta otomatisasi untuk menyalin sesuatu ke direktori itu sepertinya sedikit mengabaikan prinsip-prinsip tersebut.

Saya kira pembahasannya adalah seberapa intrusif dari docker-compose diperbolehkan? Apakah ini kasus penggunaan yang cukup umum untuk membenarkan otomatisasi semacam itu? Jika tidak, maka kita tampaknya membebani mekanisme kelulusan variabel lingkungan dengan tanggung jawab untuk memasukkan rahasia dari luar ke dalam dari satu sumber kebenaran, terlambat (misalnya saat runtime.) Saya harap poin saya cukup koheren di sini.

Ini tidak terlalu penting bagi saya, tetapi menurut saya kasus penggunaannya layak untuk didiskusikan.

Ini akan sangat berguna bagi saya. Di tempat kerja, perangkat lunak virus memblokir kemampuan Windows 10 untuk berbagi volume dengan kontainer. Ini adalah organisasi yang sangat besar dan bukan permulaan untuk membuat mereka berubah karena kebijakan yang ditetapkan di benua lain.

Halo, kasus penggunaan saya: Saya menggunakan penyiapan penulisan galangan Prometheus open source (repo dikelola oleh orang lain). Ini memiliki konfigurasi yang dipasang ke dalam wadah. MASALAH: Saya tidak dapat melakukan pembuatan dok pada mesin jarak jauh (seperti aws mesin galangan atau di dalam pelari CI / CD) karena tidak dapat memasang konfigurasi dengan benar. Dalam hal ini saya ingin menyalin / menyematkannya. Untuk data RW ada volume, untuk RO -?

Memiliki volume RO dengan kemungkinan untuk mengatur data awal adalah pilihan lain.

Solusi saat ini: sambungkan ke host buruh pelabuhan melalui ssh, clone / update repo dan jalankan docker-compose up. Ini berfungsi untuk casing manual, tetapi sulit untuk otomatisasi :(

+1

Kasus penggunaan: Saya memiliki mesin buruh pelabuhan pengembangan yang menjalankan database dan setiap kali saya menyiapkannya, saya memerlukan dump database terbaru untuk diinstal. Secara efektif itu berarti:

  1. Tarik gambar buruh pelabuhan database dari luar.
  2. Salin dan ekstrak ZIP ke dalam gambar yang sedang berjalan.
  3. Jalankan db-restore di dalam volume.
  4. Hapus db dump.

Sekarang masalah besarnya adalah bahwa langkah 2 akan selalu berbeda untuk setiap pengembang, karena ada banyak versi dump yang berbeda dari database itu, jadi yang paling mudah adalah jika setiap pengembang memiliki file tulis sendiri dengan lokasi / versi dump spesifik mereka, lalu meminta buruh pelabuhan merakit gambar dengan lokasi file tertentu saat membuat, yang kemudian dapat diubah dengan cepat ketika versi yang berbeda diperlukan.

Kasus penggunaan saya sederhana. Saya tidak ingin volume juga tidak ingin menggulung citra saya sendiri. Saya hanya ingin meletakkan salinan defensif sederhana dari file konfigurasi dalam wadah setelah dibuat dan sebelum dimulai.

apakah ini masih menjadi masalah?
Saya memiliki aplikasi django dengan file pengaturan yang sangat panjang. Bagi saya, akan lebih mudah untuk membuat image buruh pelabuhan dan menyalin satu file konfigurasi ke setiap container.
Meneruskan semua pengaturan sebagai ENV bagi saya adalah antipattern. Membutuhkan banyak kode, sulit dipelihara dan dapat diselesaikan dengan satu perintah salin.

Saya membuka # 6643 dan akan menyukai umpan balik tentang bagaimana itu akan dianggap sebagai anti-pola. Terutama, dalam lingkungan di mana banyak file konfigurasi mungkin perlu ditambahkan / dimodifikasi saat itu juga.

@ shin-

Masalah dengan ini adalah bahwa hal ini sangat berpandangan pendek (karena itu disebut "anti-pola"), karena akan memaksa Anda untuk mengulangi operasi setiap kali kontainer dibuat ulang. Belum lagi fakta bahwa skalanya sangat buruk (bagaimana jika Anda memiliki 10 kontainer? 20? 100?)

Bagaimana cara kerja docker-compose exec dengan banyak wadah?

    --index=index     index of the container if there are multiple
                      instances of a service [default: 1]

Bukankah kita harus mencoba mendapatkan perilaku yang sama dengan cp ?

IMHO exec sama singkatnya dengan cp . Tapi saya selalu menganggapnya sebagai perintah "pengembangan", lingkungan pengembangan harus singkat bukan?

Saya belum melihat komentar tentang banyak pengembang di sini yang mengatakan bahwa mereka cupet dengan mencoba terlalu cepat memperbaiki ini dengan meminta fitur ini. Saya pikir ini sedikit kasar dan merendahkan. Jika ada satu hal yang saya pelajari dari tahun-tahun perkembangan saya, itu adalah sebagai berikut:

Bukan apa yang dilakukan perangkat lunak Anda, yang penting adalah apa yang dilakukan pengguna dengannya

Jelas, saya mengerti bahwa Anda memiliki peran untuk mencegah hal-hal menjadi gila, tetapi itu bukan karena seseorang menggunakan alat secara tidak benar berdasarkan visi Anda sehingga setiap orang akan mulai melakukannya dengan cara itu dan semua neraka akan lepas.

Semua kasus khusus yang pernah saya lihat di sini sangat sesuai. Dan, sebagian besar kasus khusus ini tidak boleh dan tidak akan terjadi pada sistem produksi, mereka, misalnya, seperti kasus saya yang saya jelaskan beberapa waktu lalu, untuk menyesuaikan lingkungan pengembangan dan menjalankan file khusus dalam wadah yang tidak dapat digunakan. pemetaan volume. Sebagian besar contoh mengatakan dengan jelas bahwa mereka tidak ingin memanggang dalam skema, data, atau file konfigurasi dan tidak dapat menggunakan pemetaan volume jadi saya tidak mengerti mengapa ini terlalu merepotkan karena terlalu menggunakan istilah "Penglihatan Pendek".

Saya pikir Anda harus hati-hati menimbang kata-kata Anda ketika mengatakan hal-hal seperti itu ...

  1. Saya benar-benar tidak membutuhkan ceramah tentang apa yang boleh saya katakan atau tulis. Saya minta maaf karena "cupet" menyinggung Anda. Masih akurat untuk mengatakan bahwa hal-hal ini termasuk dalam Dockerfile berdasarkan desain.
  2. Saya bukan pemelihara lagi. Tolong hentikan @ -ing saya pada hal-hal yang tidak lagi dapat saya kendalikan.
  1. Saya harus mengatakan saya berada di pihak crazycodr di sini ... Mengabaikan kasus penggunaan dunia nyata yang benar-benar valid sebagai "anti pola", tanpa memberikan alternatif praktis dan realistis yang berguna adalah pendekatan pengembang yang tidak ramah, dan sejujurnya bahkan agak kasar.
  2. Pemelihara atau tidak, jika Anda telah mengambil bagian dalam bagian diskusi di github, pada dasarnya Anda harus hidup dengan orang yang mengomentari komentar Anda. Begitulah cara kerjanya. Atasi itu ...

Mari kita kembalikan. Pertanyaan teknis yang jujur ​​di sini. Dengan tumpukan buruh pelabuhan kami memiliki opsi "konfigurasi". Itu adalah fitur buruh pelabuhan asli tapi ini untuk layanan, bukan kontainer. Apa kelayakan untuk mendapatkan sesuatu seperti itu bekerja di tingkat penampung daripada di tingkat layanan? Bagaimana tumpukan pekerja pelabuhan menerapkan penyediaan konfigurasi? Apakah implementasi tersebut dapat direplikasi secara khusus untuk pembuatan-galangan?

Setidaknya setengah dari kasus penggunaan yang disebutkan di sini adalah tentang konfigurasi, sehingga banyak orang akan puas jika gatal itu digaruk.

Kasus penggunaan sederhana lainnya adalah hal-hal seperti validasi domain Google. Jika Anda menggunakan gambar wordpress Anda tidak dapat menambahkan file yang akan diperiksa oleh Google. Anda perlu membuat gambar baru untuk melakukannya.

Juga komentar-komentar ini yang mengatakan hal-hal "anti-pola" hampir tidak masuk akal, berbau elitisme.

EDIT: astaga, baca lebih lanjut, terima kasih Tuhan dia bukan pemelihara lagi

Jadi Anda memberi tahu saya bahwa jika saya ingin menyalin file konfigurasi kecil ke dalam gambar prebuilt (katakanlah, nginx atau mariadb ), sekarang saya perlu mengelola penyiapan dan duplikat pembuatan gambar saya sendiri ruang disk yang digunakan (gambar asli dan gambar yang dikonfigurasi)?

Ini seharusnya menjadi sebuah fitur.

menduplikasi ruang disk yang digunakan

Anda tidak saat Anda menggunakan Docker.

Saya suka bagaimana Anda memilih salah satu hal dari apa yang dia katakan yang merupakan hal paling kecil di semua itu. Ini harus menjadi fitur. Masalah ini hanya akan tumbuh dan berkembang karena orang-orang yang datang ke sini seiring berkembangnya buruh pelabuhan karena ini adalah kasus penggunaan umum dan orang-orang hanya akan mengharapkannya ada karena akal sehat, sesuatu yang dimiliki oleh mantan pengelola dan saat ini di sini tampaknya kurang.

Saya suka bagaimana Anda memilih salah satu hal dari apa yang dia katakan yang merupakan hal paling kecil di semua itu.

argumen yang tidak valid harus dicatat seperti itu.

Saya pikir masalahnya di sini adalah bahwa argumen "anti-pola" dapat valid jika diberikan strategi bisnis tertentu (lihat poin @washtubs ). kita mungkin tidak setuju dengan strategi ini, tapi itu tidak membenarkan serangan pribadi. pada akhirnya usaha @ shin -'s yang lalu dengan docker-py yang akan memungkinkan Anda untuk menerapkan alternatif untuk docker-compose .

Argumen "anti-pola" apa? Tidak ada argumen yang dibuat. Itu hanya "tidak, karena anti-pola" tanpa logika apa pun di baliknya, hanya mengatakannya tanpa ada yang mendukungnya. Ini seperti orang-orang yang mengatakan bahwa memikirkan skenario terburuk di kepala mereka, memutuskan bahwa skenario adalah anti-pola dan kemudian mengabaikan semuanya tanpa menulis tentang apa yang disebut skenario anti-pola.

Itu hanya elitisme. Banyak komentar di sini yang membahas betapa konyol alasan untuk tidak menambahkan ini dan semuanya diabaikan.

Akal sehat dan logika tidak peduli dengan perasaan atau elitisme Anda. Atau anti-pola buatan Anda.

Ya, @robclancy , tolong pertahankan FFS sipil. Saya ingin fitur ini, tetapi jika Anda hanya akan berbicara omong kosong dengan pengelola, silakan curhat di reddit. Koreksi sebelumnya

pada akhirnya @ shin-'s upaya sebelumnya dengan docker-py yang akan memungkinkan Anda untuk mengimplementasikan alternatif untuk docker-compose.

Saya jelas tidak ingin percabangan dari buruh pelabuhan, jika itu yang Anda sarankan, terutama untuk peningkatan sekejap. Itulah satu-satunya cara lain untuk mewujudkannya, dan itu akan berdampak buruk bagi komunitas.

Jika ada yang mengajukan PR, apakah itu benar-benar dipertimbangkan? Atau apakah ini sesuatu yang baru saja diputuskan oleh tim buruh pelabuhan bahwa mereka tidak akan menerimanya? Apakah sesuatu di sepanjang baris menambahkan bagian konfigurasi yang kompatibel dengan konfigurasi tumpukan buruh pelabuhan menjadi sesuatu yang akan Anda pertimbangkan?

Ini telah keluar jalur ... 'anti-pola' tanpa penjelasan mengubah 'anti-pola' menjadi definisi yang sangat luas yang tidak mungkin untuk dibantah. Juga tidak ada arah yang jelas di sisi mana 'anti-pola' itu berada; buruh pelabuhan atau buruh pelabuhan-menulis.

Definisi yang jelas tentang tanggapan anti-pola akan sangat bagus dan sangat dihargai.

Komunitas akan terus berkembang sehingga seperangkat definisi yang mapan perlu ada.

Saya ingin menggunakannya untuk menyalin artefak yang dihasilkan oleh pipeline jenkins yang berjalan pada tumpukan penulisan buruh pelabuhan. Dan kemudian, nama wadah bisa acak, jadi saya tidak bisa menggunakan docker cp .

Hari ini saya harus menggunakan

docker cp $(docker-compose -f docker-compose.development.ci.yml ps -q test):/app/tests_output ./tests_output

Apakah ini berbeda dari volumes: - ./folder_on_host/ :/folder_in_container/ ?
Saya dapat menyalin file dari host ke penampung (setara dengan COPY) dengan cara ini di file buat saya

Saya mencoba melakukan yang sama. Saya memiliki folder dengan file csv dan saya ingin memasukkannya ke logstash.
bagaimana saya bisa melakukan itu. atau folder mana di wadah?
saat ini saya memiliki sesuatu ini:
./path/to/storage:/usr/share/logstash/ data: ro

Setiap saran akan membantu

@ shin- Tiket ini sekarang berumur 1,5 tahun. Ketika 160 orang mengatakan Anda salah - Anda mungkin salah.

Apa lagi yang Anda butuhkan untuk meyakinkan Anda bahwa ini harus dilaksanakan?

@isapir , perusahaan yang tidak mendengarkan pelanggannya, cenderung segera

@ shin- Tiket ini sekarang berumur 1,5 tahun. Ketika 160 orang mengatakan Anda salah - Anda mungkin salah.

😆 🤣 💯 🥇 😲 😮

Juga,

Saya bukan pemelihara lagi. Tolong hentikan @ -ing saya pada hal-hal yang tidak lagi dapat saya kendalikan.

@sfuerte Ada sebuah proyek kecil bernama Kubernetes yang telah menggantikan Docker-Compose. Saya ingin tahu apakah itu akan terjadi jika sikap terhadap umpan balik pengguna menjadi lebih positif.

Kami membutuhkan kata kunci untuk melawan kata kunci mereka. Hanya itu yang bisa mereka tangani.

Fitur ini akan menjadi pro-pattern . Itu harus dilakukan. Perbedaannya adalah bahwa meskipun saya membuat hal bodoh itu, ada banyak komentar dalam masalah ini yang menunjukkan keuntungan dari ini dengan cara yang jelas merupakan kasus penggunaan umum. Dan tidak ada satu pun contoh dari anti-pattern .

@ shin- Anda diberi tag dalam hal ini karena Anda memulai omong kosong antipattern omong kosong ini tanpa dasar dalam kenyataan. Jadi berhentilah menangis tentang sesuatu yang Anda sebabkan.

k selamat bersenang-senang

Kasus saya adalah:

  • Selama "dev" saya ingin kode sumber saya dibuat sebagai "volume" sehingga secara otomatis diperbarui selama pengembangan
  • Saat aplikasi siap untuk dirilis dan saya perlu "menerapkan", saya ingin menyalin file yang disalin alih-alih menjadi volume.

Saya rasa cara termudah untuk mengatasi ini adalah dengan memiliki 1 file compose untuk dev dan 1 file compose untuk produksi.

Masalahnya di sini adalah bahwa saya dapat menentukan "volume" pada file buruh pelabuhan, tetapi saya tidak dapat menentukan "salinan" pada file buruh pelabuhan?

Apakah ada orang dalam kasus yang sama dengan saya? Apakah saya melewatkan sesuatu?

@ shin- apakah ini anti-pola? bagaimana Anda akan menyelesaikan masalah ini?

@hems , di dunia yang sempurna, Anda ingin aplikasi Anda diterapkan sebagai gambar buruh pelabuhan mandiri. Jadi jika Anda menulis aplikasi, kode sumber yang ingin Anda terapkan mungkin harus menjadi bagian dari Dockerfile , jadi gambar tersebut berisi seluruh aplikasi Anda. Jadi di Dockerfile , jika Anda ingin sumber Anda di / var / www Anda akan memasukkan

COPY my-app-src /var/www

Sumber Anda tidak spesifik lingkungan jadi itu hanya milik gambar buruh pelabuhan. Mudah.

Sebagian besar dari kita ingin menyertakan file konfigurasi khusus lingkungan ke dalam container yang membuat image yang ada berfungsi dengan baik dengan konfigurasi docker-compose tertentu. Dan kami ingin dapat melakukan ini tanpa membuat volume untuk file kecil, atau menggulung gambar baru.

Bisakah seseorang dari tim buruh pelabuhan melihat hal ini dengan serius dan tidak memihak dan membuat keputusan akhir (mudah-mudahan yang mengabaikan semua orang yang tidak dewasa)? Masalah ini terbuka selamanya. Hasilnya penting, tetapi secara pribadi saya lelah mendapatkan notifikasi.

COPY my-app-src /var/www

itulah yang saya katakan, dalam pengembangan saya ingin menggunakan file docker-compose saya untuk memasang VOLUMES ke dalam gambar dan selama pembuatan produksi saya ingin MENYALIN file ke dalam gambar, oleh karena itu mengapa saya pikir kita harus dapat MENYALIN dan memasang VOLUME menggunakan file docker-compose, jadi saya dapat memiliki 1 file compose untuk dev dan 1 untuk build produksi.

Saya bekerja di tim yang mengelola Tulis dan dengan senang hati saya terjun ke diskusi ini. Untuk memulai, saya akan menjelaskan bagaimana kita melihat tanggung jawab file Dockerfiles dan Compose.

Dockerfiles adalah resep untuk membuat image dan harus menambahkan semua binari / file lain yang Anda perlukan agar layanan Anda berfungsi. Ada beberapa pengecualian untuk ini: rahasia (yaitu: kredensial), konfigurasi (yaitu: file konfigurasi), dan data status aplikasi (misalnya: data database Anda). Perhatikan bahwa rahasia dan konfigurasi hanya dapat dibaca.

File tulis digunakan untuk mendeskripsikan bagaimana sekumpulan layanan diterapkan dan berinteraksi. Format Compose tidak hanya digunakan untuk satu mesin (yaitu: docker-compose ) tetapi juga untuk lingkungan yang diatur seperti Swarm dan Kubernetes. Tujuan format Tulis adalah untuk memudahkan penulisan aplikasi dan mengujinya secara lokal, lalu menerapkannya ke lingkungan yang diatur dengan sedikit atau tanpa perubahan. Tujuan ini membatasi apa yang dapat kita ubah dalam format karena perbedaan mendasar seperti bagaimana setiap lingkungan menangani volume dan penyimpanan data.

Memotong tanggung jawab file Dockerfile dan Compose seperti ini memberi kita pemisahan perhatian yang baik: Apa yang ada di setiap gambar container (Dockerfile), bagaimana layanan diterapkan dan berinteraksi (Compose file).

Sekarang saya akan membahas setiap pengecualian untuk apa yang Anda simpan dalam gambar. Untuk rahasia, Anda tidak ingin ini dimasukkan ke dalam gambar karena dapat dicuri dan karena dapat berubah seiring waktu. Rahasia Docker digunakan untuk memecahkan masalah ini. Ini bekerja sedikit berbeda bergantung pada lingkungan mana Anda menerapkan tetapi pada dasarnya idenya adalah bahwa Anda dapat menyimpan kredensial dalam file yang akan dipasang hanya baca ke direktori tmpfs di penampung saat runtime. Perhatikan bahwa direktori ini akan selalu menjadi /run/secrets/ dan file akan menjadi nama rahasia. Rahasia didukung di Swarm, hanya mesin ( docker-compose ), dan Kubernetes.

Untuk file konfigurasi atau data bootstrap, ada Docker Configs . Ini berfungsi mirip dengan rahasia tetapi dapat dipasang di mana saja. Ini didukung oleh Swarm, dan Kubernetes, tetapi tidak oleh docker-compose . Saya yakin bahwa kami harus menambahkan dukungan untuk ini dan itu akan membantu dengan beberapa kasus penggunaan yang tercantum dalam masalah ini.

Terakhir, ada data status aplikasi yang perlu disimpan secara eksternal. Saya tidak akan menyelami ini karena tidak terkait dengan masalah ini.

Dengan pembingkaian itu, saya bisa menjawab beberapa pertanyaan:

  • Apakah kami akan menambahkan bidang copy ke format Tulis? Tidak, saya tidak berpikir kami akan melakukannya karena tidak masuk akal dalam lingkungan yang diatur.
  • Akankah kita menambahkan configs support ke docker-compose ? Ya, saya pikir kita harus melakukannya.
  • Akankah kita menambahkan docker-compose cp ? Mungkin, saya belum yakin tentang ini. Ini pada dasarnya akan menjadi alias untuk docker container cp .

Karena itu, ada beberapa alat yang dapat digunakan di sini:

  • Build multi-tahap yang memungkinkan Anda menambahkan file secara bersyarat ke gambar menggunakan target.
  • Rahasia yang memungkinkan Anda meneruskan kredensial ke layanan pada waktu proses.
  • Konfigurasi yang memungkinkan Anda meneruskan informasi konfigurasi ke layanan saat runtime.

Saya _pikir_ alat itu menyelesaikan semua masalah yang diangkat di utas ini.

Utas ini cukup panas. Harap diingat bahwa ada orang sungguhan di balik setiap pegangan GitHub dan bahwa mereka mungkin berusaha melakukan yang terbaik (bahkan jika rasa frustrasi mereka terlihat). Kami semua bersemangat tentang Compose dan ingin proyek ini terus berkembang.

Akankah kita menambahkan docker-compose cp ? Mungkin, saya belum yakin tentang ini.

Saya akan menemukan kenyamanan yang bermanfaat seperti docker-compose exec .

@ chris-crone Respon yang luar biasa, terima kasih!

Saya tahu saya tidak berbicara mewakili semua orang , tetapi saya mendapat kesan bahwa configs support memenuhi sebagian besar minat di sini. Akankah masalah dibuka untuk ini?

Dan terima kasih telah menawarkan beberapa pendekatan alternatif. Saya tidak tahu tentang pembangunan multi-tahap sampai sekarang.

Saya mendapat kesan bahwa configs dukungan memuaskan sebagian besar minat di sini.

Saya meragukan ini karena saya curiga mayoritas di sini tidak menggunakan Swarm dan afaik fungsi config memerlukan itu.

Ya, saat ini Swarm diperlukan, tetapi dari komentar @ chris-crone ...

Ini didukung oleh Swarm, dan Kubernetes, tetapi tidak oleh docker-compose. Saya yakin bahwa kami harus menambahkan dukungan untuk ini dan itu akan membantu dengan beberapa kasus penggunaan yang tercantum dalam masalah ini.

... Saya membaca bahwa ini dapat diterapkan di docker-compose (sans Swarm)

Tujuan format Tulis adalah untuk memudahkan penulisan aplikasi dan mengujinya secara lokal, lalu menerapkannya ke lingkungan yang diatur dengan sedikit atau tanpa perubahan.

Dalam aplikasi yang kompleks, kami mungkin memiliki beberapa file konfigurasi yang perlu diubah saat itu juga. Saat ini cara yang paling efisien (bijak & biaya) untuk melakukannya adalah dengan mengisi tombol volume (karena tidak ada orang waras yang akan membuat gambar yang berbeda saat menguji beberapa konfigurasi .. kecuali mereka memiliki bos yang suka menghabiskan uang pada jam kerja dev).

Swarm dan config tidak benar-benar akan menjawab beberapa kasus penggunaan yang terdaftar. "Pemisahan perhatian" juga tidak berlaku karena compose sudah melakukan apa yang dapat Anda lakukan di buruh pelabuhan, tetapi menyederhanakannya. Pembungkus bukanlah pemisahan ... kami hanya meminta Anda untuk memperpanjangnya sedikit lagi ...

https://github.com/docker/compose/issues/6643

Dapatkan hacky dengan itu .. memperluas fungsionalitas volume di mana setiap file di bawah kunci baru secara dinamis ditautkan ke volume tunggal dan dipetakan ke jalur internal masing-masing ...

Saya pikir ada dua skenario di sini yang benar-benar valid, satu tentang
lingkungan pengembangan. Orang menciptakan lingkungan yang fleksibel dengan sumbernya
kode dipasang ke gambar mereka. Kode sumber berkembang seiring perkembangan
terjadi dan Anda tidak dapat membangun kembali gambar secara konstan atau Anda hanya membuang-buang
waktu yang sangat banyak. Itu persis skenario saya dan saya bisa melihat ini
skenario berlaku untuk banyak orang lain.

Yang kedua adalah tentang gambar produksi tempat Anda memanggang kode sumber Anda
(jika Anda bekerja dengan skrip yang tidak dikompilasi) ke dalam gambar Anda (dan
sekali lagi, saya tidak, saya masih memasangnya di sisi saya) atau Anda hanya
kompilasi aplikasi Anda dan salin ke dalam gambar akhir. Pada saat itu,
aplikasi menjadi sangat portabel.

Saya pikir semua orang mengerti itu! Pertanyaannya adalah, apakah buruh pelabuhan-menulis
dev meluangkan waktu untuk membacakan kasus dan memahami kebutuhannya? Ada
tidak ada anti-pola di sini dalam teori, hanya pengembang yang memiliki kebutuhan dan keinginan
untuk dihormati.

Kami suka buruh pelabuhan, buruh pelabuhan dan semua ekosistem, kami menggunakannya karena kami
menyukainya dan karena kami menggunakannya, Anda memiliki pekerjaan (setidaknya beberapa dari Anda dibayar
untuk itu saya harap).

Sesuatu yang saya pelajari dalam beberapa tahun terakhir yang ingin saya bawa kembali ke sini dan
ada yang berikut dan ini berlaku sangat baik untuk skenario ini:

Yang penting bukanlah apa yang perangkat lunak Anda lakukan, melainkan apa yang dilakukan pengguna Anda
dengan itu yang penting

Ceria dan kesinambungan yang bahagia!

Pada Kamis, 6 Juni 2019 pukul 10:55, jadon1979 [email protected] menulis:

Tujuan dari format Tulis adalah untuk memudahkan penulisan aplikasi
dan mengujinya secara lokal, lalu menerapkannya ke lingkungan yang diatur dengan
sedikit atau tidak ada perubahan.

Dalam aplikasi yang kompleks, kami mungkin memiliki beberapa file konfigurasi yang diperlukan
mengutak-atik dengan cepat. Sekarang cara yang paling efisien (waktu & biaya)
melakukan itu berarti mengisi kunci volume (karena tidak ada orang waras yang pergi
untuk membuat gambar yang berbeda saat menguji beberapa konfigurasi .. kecuali
mereka memiliki bos yang suka menghabiskan uang untuk jam kerja developer).

Swarm dan config tidak benar-benar akan menjawab beberapa kasus penggunaan
terdaftar. "Pemisahan perhatian" juga tidak berlaku seperti yang sudah ditulis
melakukan apa yang dapat Anda lakukan di buruh pelabuhan, tetapi menyederhanakannya. Pembungkus tidak
pemisahan ... kami hanya meminta Anda untuk memperpanjangnya sedikit lagi ...

6643 https://github.com/docker/compose/issues/6643

Dapatkan hacky dengan itu .. memperluas fungsionalitas volume di mana setiap file di bawah
kunci baru secara dinamis ditautkan ke volume tunggal dan dipetakan ke tombol tersebut
jalur internal masing-masing ...

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/docker/compose/issues/5523?email_source=notifications&email_token=ABBR3OMQH62242SM4QN5Y7TPZEQP7A5CNFSM4EKAVONKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODXDDP4Q#issuecomment-499529714 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ABBR3OMOZFZ47L6ITHPF2TDPZEQP7ANCNFSM4EKAVONA
.

Saya ingin menjalankan lingkungan Tomcat buruh pelabuhan untuk menjalankan aplikasi saya dari .war yang tidak bernama ROOT.war . Untuk melakukan ini, saya harus menyalinnya ke dir Tomcat webapps dan mengganti namanya menjadi ROOT sehingga akan berjalan pada port yang saat ini terikat 8005/9. Ada lagi yang gagal karena masalah rebinding pada port dengan kesalahan tentang 'akses ilegal'. Ini adalah build pengujian singkat sehingga tidak bisa masuk ke Dockerfile. Inilah mengapa saya menginginkannya di docker-compose

@tokopedia

Saya tahu saya tidak berbicara untuk semua orang, tetapi saya mendapat kesan bahwa dukungan konfigurasi memuaskan sebagian besar minat di sini. Akankah masalah dibuka untuk ini?

Jika belum ada masalah untuk ini, buatlah dan tautkan di sini. Saya telah menambahkan sesuatu di pelacak tim pribadi kami.

@washtubs @funkyfuture

... Saya membaca bahwa ini dapat diterapkan di docker-compose (sans Swarm)

Kami sudah memiliki dukungan rahasia yang belum sempurna dan konfigurasi dapat diterapkan dengan cara yang sama.

Jelas merupakan fitur yang hilang. Satu-satunya "antipattern" adalah ketika Anda harus mengatasi fakta bahwa ini sulit dilakukan dengan cara lain, seperti misalnya mengubah skrip titik masuk dari file dock, atau mengikat file pemasangan ke dalam wadah.

Yang Anda inginkan adalah container yang dibuat satu kali, lebih disukai secara resmi) dan dapat dikonfigurasi untuk kasus penggunaan, pada titik penggunaan, yaitu docker-compose.

Sejauh yang saya bisa lihat apa yang gagal disadari oleh para pekerja buruh pelabuhan adalah bahwa "Dockerfile" adalah antipattern terbesar dalam konsep buruh pelabuhan secara keseluruhan, terutama karena semuanya sama sekali tidak dapat dibaca dan tidak dapat dipertahankan. Ini benar-benar membuat saya tertawa ketika ada orang yang berhubungan dengan buruh pelabuhan membuang kata "antipattern" seperti mereka akan tahu!

Dockerfile sebenarnya mencegah debugging dan perapihan normal yang akan tersedia jika Anda menggunakan skrip build, atau sesuatu yang sebenarnya dirancang untuk membuat sesuatu, seperti ... manajer paket, atau make.

Untuk saya sendiri, saya menggunakan DockerFile yang sama untuk semua kasus penggunaan (menjadikannya sebuah pola!) Menyarankan agar saya pergi dan mengubah DockerFile saya untuk setiap penggunaan yang berbeda, benar-benar anti-pola.

Dan tidak ada "dukungan konfigurasi" yang tidak memotongnya sama sekali, memaksakan struktur di mana tidak diperlukan.

Masalah mendasar adalah bahwa jika Anda mengikat mount ke say / etc / nginx itu harus rw untuk memungkinkan skrip berjalan yang menyesuaikan konfigurasi (alias. Envsubst). Dan ini kemudian membuat perubahan pada konfigurasi input (yang harus tetap tidak dapat diubah) ... Anda tidak mendapatkan lebih banyak antipattern daripada wadah yang menulis di seluruh konfigurasinya, jadi opsi untuk menyalin file ke dalam wadah pada waktu pembuatan ulang adalah diperlukan larutan.

Dengan kata lain, ini adalah direktori bind mount rw dalam wadah, tetapi ro pada host. Serius akankah membunuhmu jika membiarkan ini?

Jelas merupakan fitur yang hilang. Satu-satunya "antipattern" adalah ketika Anda harus mengatasi fakta bahwa ini sulit dilakukan dengan cara lain, seperti misalnya mengubah skrip titik masuk dari file dock, atau mengikat file pemasangan ke dalam wadah.

Yang Anda inginkan adalah container yang dibuat satu kali, lebih disukai secara resmi) dan dapat dikonfigurasi untuk kasus penggunaan, pada titik penggunaan, yaitu docker-compose.

Sejauh yang saya bisa lihat apa yang gagal disadari oleh para pekerja buruh pelabuhan adalah bahwa "Dockerfile" adalah antipattern terbesar dalam konsep buruh pelabuhan secara keseluruhan, terutama karena semuanya sama sekali tidak dapat dibaca dan tidak dapat dipertahankan. Ini benar-benar membuat saya tertawa ketika ada orang yang berhubungan dengan buruh pelabuhan membuang kata "antipattern" seperti mereka akan tahu!

Dockerfile sebenarnya mencegah debugging dan perapihan normal yang akan tersedia jika Anda menggunakan skrip build, atau sesuatu yang sebenarnya dirancang untuk membuat sesuatu, seperti ... manajer paket, atau make.

Untuk saya sendiri, saya menggunakan DockerFile yang sama untuk semua kasus penggunaan (menjadikannya sebuah pola!) Menyarankan agar saya pergi dan mengubah DockerFile saya untuk setiap penggunaan yang berbeda, benar-benar anti-pola.

Dan tidak ada "dukungan konfigurasi" yang tidak memotongnya sama sekali, memaksakan struktur di mana tidak diperlukan.

Masalah mendasar adalah bahwa jika Anda mengikat mount ke say / etc / nginx itu harus rw untuk memungkinkan skrip berjalan yang menyesuaikan konfigurasi (alias. Envsubst). Dan ini kemudian membuat perubahan pada konfigurasi input (yang harus tetap tidak dapat diubah) ... Anda tidak mendapatkan lebih banyak antipattern daripada wadah yang menulis di seluruh konfigurasinya, jadi opsi untuk menyalin file ke dalam wadah pada waktu pembuatan ulang adalah diperlukan larutan.

Dengan kata lain, ini adalah direktori bind mount rw dalam wadah, tetapi ro pada host. Serius akankah membunuhmu jika membiarkan ini?

Sesuatu seperti ini:

``

jika file maka timpa

Jika direktori kemudian menimpa / menambahkan konten tujuan

dengan konten dari sumber untuk mempertahankan struktur tujuan asli

sumber: file : izin: pemilik : grup

svc:
salinan:
- './source/filename:/path/ namafile: ro : www-data'
- './source/dir:/path/ dir: ro : www-data'

# atau
svc:
salinan:
- sumber: './source/file'
tujuan: '/ tujuan'
izin: ro
pemilik: pemilik
grup: grup
- sumber: './source/directory'
tujuan: '/ tujuan'
izin: ro
pemilik: pemilik
grup: grup ``

Kasus penggunaan: Kami memiliki solusi container unorchestrated di mana kami memiliki file-file pembuatan-galangan aplikasi kami termasuk. Sertifikat SSL, dll. Di dalam repositori Git dan menariknya ke VM. Kemudian kami menjalankan layanan dan ingin memindahkan mis. Sertifikat SSL, file konfigurasi, dll. Ke volume penampung. Ini saat ini tidak mungkin tanpa Dockerfile yang menyertai dengan perintah COPY yang ditampilkan. Kami tidak ingin mengotak-atik file di dalam repo git kloning. Jika aplikasi akan mengubah file, kami harus membersihkan repo setiap saat.

@MartinMajewski maka Anda dapat memasang direktori dengan sertifikat sebagai volume dan mengarahkannya ke konfigurasi aplikasi Anda.

Kasus penggunaan (dan pertanyaan cara melakukan sekaligus):
Saya memiliki gambar postgres dengan satu variabel lingkungan yang harus disetel di awal: POSTGRES_PASSWORD . Saya ingin mengaturnya melalui Docker Secret. Yang perlu saya lakukan hanyalah memasukkan entrypoint.sh saya sendiri yang akan mengekspor Secret terlampir ke env var dari container yang sedang berjalan. Saya perlu menambahkan entrypoint ini ke dalam penampung saya saat peluncuran. Tanpa Dockerbuild dua baris - saya tidak bisa. Salinan satu file - tidak dapat dilakukan.

PS postgres adalah contoh. Asumsikan tidak mendukung _FILE env vars.

Kasus penggunaan: Karaf
Dengan menggunakan gambar dasar karaf yang tidak ingin saya bangun kembali setiap kali saya membangun proyek, saya ingin dapat menerapkan aplikasi saya dengan cepat dan membangun kembali penampung untuk setiap pembuatan. Namun, saya perlu menyalin _features.xml_ dan _jar_ ke dalam direktori penerapan saat memulai penampung.

Solusi saya sampai sekarang adalah menggunakan image karaf sebagai image dasar di Dockerfile lain (mengandalkan overlayfs - yang pada akhirnya akan kehabisan overlay, memaksa penghapusan gambar secara manual) dan avast / gradle-docker-compose-plugin. Meskipun perintah init pasti bisa diteruskan sebagai variabel lingkungan, konten dari features.xml tidak bisa. Ini harus disimpan sebagai file di lokasi tertentu dalam wadah. Saat ini, saya hanya dapat menggunakan volume bind mount untuk melakukan ini. Bagaimana cara memasukkan barang ke volume itu di mesin jarak jauh? Saya masih membutuhkan lebih banyak logika dalam skrip build saya (misalnya org.hidetake.groovy.ssh, yang juga memperumit skrip build dengan sandi rahasia / logika kunci). Jika sebuah docker-compose cp tersedia, saya bisa menambahkan perintah copy yang diperlukan ke docker-compose.yml. avast / gradle-docker-compose-plugin akan menangani pembuatan container dan menyalin file dari output build saya langsung ke container tanpa logika akses filesystem jarak jauh tambahan.

Dockerfile ini ditambahkan ke bagian build docker-compose.yml saya dari skrip. Jika ada, ini adalah antipattern, karena hanya menambahkan overlay ke gambar buruh pelabuhan hulu dengan setiap build (sampai saya terpaksa menghapus gambar secara manual - yang membuat build jauh lebih lambat).

FROM myregistry:443/docker/image/karaf-el7:latest

COPY karafinitcommands /usr/local/karaf/etc/

COPY features.xml \
     *.jar \
     /usr/local/karaf/deploy/

Saya merasa frustasi karena docker cp berfungsi dengan baik untuk menyalin runtime, tetapi docker-compose tidak memiliki mekanisme yang setara.

Saya pikir idenya adalah mengikat mount direktori lokal ke / usr / local / karaf / deploy dan meletakkan file Anda di sana. Saya tidak berharap harus membangun kembali gambar atau menggunakan file buruh pelabuhan untuk mencapai ini.

Saya pikir idenya adalah mengikat mount direktori lokal ke / usr / local / karaf / deploy dan meletakkan file Anda di sana. Saya tidak berharap harus membangun kembali gambar atau menggunakan file buruh pelabuhan untuk mencapai ini.

Hal itu pasti bisa dicapai dengan cara itu. Baca ulang dan perhatikan bahwa ini murni masalah kenyamanan: Container akan dibangun kembali oleh gradle build, langkah logika berikutnya adalah: Bagaimana cara memindahkan file build baru ke "direktori lokal" yang dipasang di / usr / local / karaf / deploy? Dalam kasus saya, "direktori lokal" lebih tepat disebut "direktori host" di mana host adalah host jarak jauh. Jadi saya harus menambahkan rsync atau sesuatu yang lain ke skrip build saya hanya untuk mendapatkan file di sana dan memastikan yang lama diganti, dan yang tambahan dihapus. Ini tidak akan diperlukan jika docker-compose cp tersedia. Saya dapat menggunakan klien buruh pelabuhan yang ada untuk koneksi daemon buruh pelabuhan, yang telah saya siapkan melalui penerusan port.

Volume Docker dapat dihapus dengan setiap build. Volume bind mount tidak bisa. Mereka akan terisi kembali hanya jika kosong (mekanisme perlindungan persistensi). Tentu saja, mengosongkan bind mount pada mesin jarak jauh memerlukan izin tertentu dan logika akses yang semuanya dapat dihindari dengan cp penulisan-buruh pelabuhan.

Sekali lagi, salinan ke lingkungan runtime dapat dilakukan dengan docker cp. Itu adalah bagian yang membuat frustrasi.

Ah, oke, saya terlalu terbiasa dengan pengaturan saya sendiri. Saya menggunakan http://github.com/keithy/groan skrip bash yang menyebarkan sendiri potongan-potongan ke server jarak jauh, lalu kami memanggil buruh pelabuhan.

Kasus penggunaan: google cloud membangun dan membangun artefak

Artefak yang diperlukan: klien web (dihasilkan secara otomatis) mereaksikan graphql binding. Anda perlu menjalankan server untuk membuat file yang diperlukan untuk kompilasi klien. Gambar klien memiliki alat untuk membuat binding, diberi alamat server. Jadi Anda memulai image server di backgound, dan sekarang perlu menjalankan container klien yang mengarah ke server. Sekarang bagaimana cara mengeluarkan file yang dihasilkan dari penampung, dan masuk ke direktori host "ruang kerja"? Memasang direktori tidak diperbolehkan, karena Anda sudah berada di direktori yang terpasang di kontainer buruh pelabuhan. Mampu docker-compose cp akan mengurangi langkah menyakitkan ekstra untuk mendapatkan id kontainer.

Mengandalkan $(docker-compose ps -q SERVICE) untuk menargetkan container yang tepat memungkinkan penggunaan CLI buruh pelabuhan biasa untuk operasi container-centric tersebut. Memperkenalkan perintah baru pasti akan membuatnya lebih sederhana untuk beberapa kasus penggunaan yang memintanya, tetapi tidak diperlukan. Untuk menghindari lebih banyak duplikasi kode antara compose dan docker CLI, saya pikir masalah ini harus ditutup.

Ada masalah terbuka di mana build cache antara compose dan docker biasa berbeda, karena versi dari docker daemon compose yang digunakan, artinya Anda perlu menggunakan pure compose untuk tidak merusak cache di lingkungan CI (https: // github .com / docker / compose / issues / 883) sehingga hingga masalah tersebut diselesaikan, mencampur perintah buruh pelabuhan biasa dengan perintah penulisan akan merusak cache. Konfigurasi compose menentukan semua jenis konfigurasi yang dipanggang, mengurangi kebutuhan untuk kemudian secara manual menentukan konfigurasi duplikat dengan perintah biasa docker .

Mengandalkan $(docker-compose ps -q SERVICE) untuk menargetkan container yang tepat memungkinkan penggunaan CLI buruh pelabuhan biasa untuk operasi container-centric tersebut. Memperkenalkan perintah baru pasti akan membuatnya lebih sederhana untuk beberapa kasus penggunaan yang memintanya, tetapi tidak diperlukan. Untuk menghindari lebih banyak duplikasi kode antara compose dan docker CLI, saya pikir masalah ini harus ditutup.

Ini jauh lebih dalam daripada "Beberapa kasus penggunaan yang disebutkan" karena skenario tersebut cukup umum dan memodifikasi, membangun gambar, memodifikasi lagi, membangun gambar, dll adalah ayat time sink yang dapat menangani hal-hal tersebut melalui docker-compose. Argumen "Anda bisa melakukannya di CLI buruh pelabuhan jadi lakukan saja di sana" cukup banyak membatalkan banyak hal lain yang telah ditambahkan ke docker-compose.

Isu yang satu ini sudah dibuka hampir setahun dan masih banyak pembahasan lain tentangnya di luar isu ini. Ini pasti tidak boleh ditutup kecuali itu benar-benar diselesaikan.

@dionjwa # 883 benar-benar perlu diselidiki (jika masih relevan) karena buruh pelabuhan-menulis harus diselaraskan dengan CLI buruh pelabuhan.

@ jadon1979 Saya tidak mencoba memblokir permintaan fitur ini, baru saja mengetahui bahwa ini telah dibuka lebih dari 1 tahun yang lalu, dan tidak ada pengelola inti yang menganggapnya cukup penting untuk memperkenalkan perintah baru, dan kontributor juga tidak mengusulkan PR untuk Itu.
Saya hanya mengatakan bahwa, berdasarkan umpan balik pada permintaan fitur ini, dan kurangnya upaya pengembangan untuk menawarkan "cara yang lebih baik", solusi yang diusulkan untuk menggunakan kombinasi docker-compose dan docker cli, yang dapat Anda alias dengan mudah di lingkungan Anda agar tetap mudah digunakan, adalah solusi yang masuk akal.
Sekarang, jika seseorang membuka PR untuk menawarkan perintah cp saya akan dengan senang hati memeriksanya.

Tidak ada yang berkontribusi karena semua orang diberitahu bahwa setiap use case adalah file
anti pola. Dan setiap beberapa hari kami mem-posting kasus penggunaan baru, tidak ada
anti pola.

Pada hari Senin, 18 November 2019 jam 17:31 Nicolas De loof [email protected]
menulis:

@dionjwa https://github.com/dionjwa # 883
https://github.com/docker/compose/issues/883 benar-benar perlu
diselidiki (jika masih relevan) karena buruh pelabuhan harus diselaraskan dengan
buruh pelabuhan CLI.

@ jadon1979 https://github.com/jadon1979 Saya tidak mencoba memblokir ini
permintaan fitur, baru saja diketahui telah dibuka lebih dari 1 tahun yang lalu, dan
tidak ada pengelola inti yang menganggapnya cukup penting
memperkenalkan perintah baru, dan kontributor tidak mengusulkan PR untuk itu.
Saya hanya mengatakan bahwa, berdasarkan umpan balik pada permintaan fitur ini,
dan kurangnya upaya pengembangan untuk menawarkan "cara yang lebih baik", yang diusulkan
solusi untuk menggunakan kombinasi docker-compose dan docker cli, yang Anda
dapat dengan mudah alias di lingkungan Anda agar tetap mudah digunakan, adalah a
solusi yang masuk akal.
Sekarang, jika seseorang membuka PR untuk menawarkan perintah cp baru, dengan senang hati saya akan melakukannya
memeriksanya.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/docker/compose/issues/5523?email_source=notifications&email_token=AAGRIF2NS64IYANNVTGFTULQUL3TZA5CNFSM4EKAVONKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEELZ6CQ#issuecomment-555196170 ,
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/AAGRIFY7CULCUS3TDDTTHZLQUL3TZANCNFSM4EKAVONA
.

Kasus penggunaan saya tidak menyalin hal-hal _into_ penampung, itu menyalinnya _out_ penampung setelah itu dijalankan. Ini dapat dilakukan dari CLI menggunakan solusi kikuk yang menghasilkan fungsionalitas yang bisa dibilang terdegradasi . Detail lengkapnya di bawah.

Saya seorang insinyur DevOps, dan saya sangat bergantung pada kontainer sebagai alternatif dari ketergantungan agen perakit logam murni. Ketika sistem CI saya menguji repo, itu dimulai dengan membangun dari Dockerfile dalam repo yang sama, dan menjalankan semua pemeriksaan ( bundle exec rspec , npm test , dll) _ di dalam container_. Jika ada artefak build yang dibuat seperti dokumentasi atau hasil pengujian, saya cukup menyalinnya dari container dengan docker cp .

Untuk pengujian integrasi, kami telah mulai menggunakan docker-compose untuk menyediakan dependensi layanan (misalnya server database) ke container yang menjalankan pengujian. Sayangnya, "solusi CLI buruh pelabuhan" kurang berguna dalam kasus ini untuk menyalin file.

Pertimbangkan konfigurasi ini: docker-compose-minimal.yml

version: "3"
services:
  artifact-generator:
    image: busybox

Saya akan membuat penampung, menjalankan perintah di penampung itu, mendapatkan ID penampung, dan mencoba mengekstrak file menggunakan docker cp

$ # Prepare the images and (stopped) containers.  In this case there is only one.
$ docker-compose --file docker-compose-minimal.yml up --no-start
Creating network "docker-compose-cp-test_default" with the default driver
Creating docker-compose-cp-test_artifact-generator_1 ... done
$ # Determine the ID of the container we will want to extract the file from
$ docker-compose --file docker-compose-minimal.yml ps -q artifact-generator
050753da4b0a4007d2bd3514a3b56a08235921880a2274dd6fa0ee1ed315ff88
$ # Generate the artifact in the container
$ docker-compose --file docker-compose-minimal.yml run artifact-generator touch hello.txt
$ # Check that container ID again, just to be sure
$ docker-compose --file docker-compose-minimal.yml ps -q artifact-generator
050753da4b0a4007d2bd3514a3b56a08235921880a2274dd6fa0ee1ed315ff88
$ # OK, that looks like the only answer we're going to get.  Can we use that to copy files?
$ docker cp $(docker-compose --file docker-compose-minimal.yml ps -q artifact-generator):hello.txt ./hello-artifact.txt
Error: No such container:path: 050753da4b0a4007d2bd3514a3b56a08235921880a2274dd6fa0ee1ed315ff88:hello.txt
$ # Nope.  Let's take a look at why this is
$ docker container ls -a
CONTAINER ID        IMAGE                        COMMAND                   CREATED              STATUS                          PORTS               NAMES
9e2cb5d38ba0        busybox                      "touch hello.txt"         About a minute ago   Exited (0) About a minute ago                       docker-compose-cp-test_artifact-generator_run_dd548ee686eb
050753da4b0a        busybox                      "sh"                      2 minutes ago        Created                                             docker-compose-cp-test_artifact-generator_1

Seperti yang Anda lihat, docker-compose ps benar-benar tidak memiliki pengetahuan tentang ID penampung yang diperbarui. Ini sangat disayangkan. Ini tidak akan terlalu buruk jika ada cara bagi saya untuk mengetahui bahwa run_dd548ee686eb entah bagaimana terkait dengan docker-compose run saya eksekusi, tetapi saya tidak melihat cara untuk mencapai itu.

Ada solusi yang kikuk untuk solusi ini, yaitu menambahkan --name ke perintah jalankan:

$ docker-compose --file docker-compose-minimal.yml run --name blarg artifact-generator touch hello.txt
$ docker cp blarg:hello.txt ./hello-artifact.txt
$ ls 
docker-compose-minimal.yml  hello-artifact.txt

Keberhasilan! ...agak

Masalahnya di sini adalah bahwa jika saya memiliki beberapa build yang berjalan secara paralel, saya harus bersusah payah membuat --name s unik secara global. Jika tidak, saya akan mendapatkan benturan berisik dalam kasus terbaik dan hasil rusak (tidak ada kesalahan, tetapi file yang salah diekstrak) dalam kasus terburuk. Jadi ini kikuk karena saya sekarang harus menemukan kembali pembuatan ID kontainer daripada hanya menggunakan yang sudah dibuat oleh Docker.

Minimal, saya ingin beberapa cara untuk mengetahui ID wadah yang dihasilkan dari perintah docker-compose run .

@delo

Mengandalkan $ (docker-compose ps -q SERVICE) untuk menargetkan container yang tepat memungkinkan penggunaan docker cli biasa untuk operasi yang berpusat pada container.

Salah, lihat demonstrasi di komentar sebelumnya.

Kami akan memiliki kasus penggunaan baru selama bertahun-tahun di sini. Tunggu maksudku anti baru
pola ...

Pada Jumat, 13 Desember 2019, 11:40 Ian, [email protected] menulis:

@ndeloof https://github.com/ndeloof

Mengandalkan $ (docker-compose ps -q SERVICE) untuk menargetkan container yang tepat
memungkinkan untuk menggunakan buruh pelabuhan biasa cli untuk kontainer-sentris tersebut
operasi.

Salah, lihat demonstrasi di komentar sebelumnya.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/docker/compose/issues/5523?email_source=notifications&email_token=AAGRIF2NFPTKY3QKRIXQ5RTQYONHLA5CNFSM4EKAVONKYY3PNVWWK3TUL52HS4DFVREXG43VMVW502HS4DFVREXG43
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/AAGRIF3S4UHF5NG3VKYXJB3QYONHLANCNFSM4EKAVONA
.

Siapa yang dapat kami sebutkan untuk mendapatkan pengelola? Masalah ini tidak ada gunanya sampai mereka mulai berbicara dengan kita. Mungkin sederhana "itu tidak dapat dilakukan karena arsitektur perangkat lunak saat ini", apa pun. Tetapi membiarkan masalah seperti itu tidak aktif bukanlah sesuatu yang ingin Anda lihat dari solusi yang sangat populer ini seperti Docker ...

Penerapan kami membangun gambar Docker dengan bazel, mengunggahnya ke Registry Docker kami, lalu menggunakan Terraform docker_container resources dengan upload stanzas untuk menyalin file konfigurasi ke kontainer. Saya perlu memigrasi proses penerapan ini untuk menggunakan docker-compose, bukan Terraform. Saya terkejut bahwa docker-compose tidak menyediakan fungsi untuk konfigurasi per container.

Masalah ini telah terbuka selama 2 tahun. Apakah ini alasan popularitas Kubernetes melampaui Docker? Kubernetes menyediakan fungsi config dan secret. Tim Docker, setidaknya tambahkan fungsionalitas konfigurasi.

tbf docker-compose tidak sama persis dengan k8s, dan tidak direkomendasikan untuk penggunaan produksi. Ini dimaksudkan untuk pengembangan dan pengujian cepat. buruh pelabuhan adalah hal yang dibandingkan dengan k8s dan meskipun juga sangat sederhana, ia memiliki fitur seperti konfigurasi dan rahasia.

Jika itu dimaksudkan hanya untuk pengembangan maka itu lebih alasan masalah ini
harus bekerja. Aturan "anti pola" yang jelek seharusnya tidak seperti itu
penting (saya katakan jelek karena jelas dengan banyaknya penggunaan normal
kasus yang tidak menyerupai anti-pola).

Pada Sel, 3 Mar 2020 jam 12.56, David Milum, [email protected]
menulis:

tbf docker-compose tidak sebanding dengan k8s, dan tidak direkomendasikan
untuk penggunaan produksi. Ini dimaksudkan untuk pengembangan dan pengujian cepat. buruh pelabuhan
swarm adalah hal yang dibandingkan dengan k8s dan meskipun itu juga sangat
sederhana, ia memiliki fitur seperti konfigurasi dan rahasia.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/docker/compose/issues/5523?email_source=notifications&email_token=AAGRIFZTKGRWMZZ5H6DG3FDRFUSEJA5CNFSM4EKAVONKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW2ZQLOFVREXG43VMVBW2ZQLOFVRXG43
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/AAGRIF4NTQQSR2QQWPJT6PLRFUSEJANCNFSM4EKAVONA
.

"Anti-pola" lainnya:

Saya menggunakan docker-compose untuk orkestrasi container selama pengembangan lokal, dan k8s untuk produksi.

Sesuai saran Docker sendiri , saya telah mengimplementasikan skrip wait-for-it.sh untuk mengelola urutan startup / shutdown layanan.

Seperti berdiri, kecuali saya ingin memasang volume di setiap layanan hanya untuk satu file ini, ini memerlukan salinan skrip di direktori yang berisi Dockerfile setiap layanan.

Sebagai gantinya, saya ingin menyimpan satu salinan dari skrip wait-for-it di direktori tingkat atas yang docker-compose kemudian menyalinnya ke dalam setiap penampung saat berjalan secara lokal, karena masalah seperti itu dikelola di k8s, artinya saya tidak ingin masalah ini mencemari layanan saya Dockerfile s.

Seperti yang pernah ditulis Emerson: "Konsistensi yang bodoh adalah hobgoblin dari pikiran kecil, yang dipuja oleh negarawan kecil, filsuf, dan dewa."

Mungkin sudah waktunya untuk mendengarkan pengguna Anda ...

@Phylodome tidak bisakah Anda menggunakan pemeriksaan kesehatan kontainer dan docker-compose depends_on ? Begitulah cara saya memastikan ketergantungan startup container yang sehat.

Pemahaman saya adalah bahwa wait-for-it.sh benar-benar peretasan, karena layanan Anda sendiri harus tahan terhadap ketergantungan yang datang dan pergi. Startup hanyalah kasus individual itu.

@ianfixes Apakah "layanan Anda" dimaksudkan untuk merujuk ke layanan tulis-galangan itu sendiri, atau layanan "kami", seperti dalam, layanan yang ditulis oleh kami yang menggunakan jasa galangan-galangan? Saya tidak tahu apakah Anda menulis dengan peran sebagai "pengguna" atau pengembang pembuat galangan kapal.

Apakah "layanan Anda" dimaksudkan untuk merujuk ke layanan tulis-galangan itu sendiri, atau layanan "kami", seperti dalam, layanan yang ditulis oleh kami yang menggunakan jasa galangan-galangan?

Layanan yang Anda bangun sebagai pengembang harus tangguh. Ini sesuai dengan dokumen berikut: https://docs.docker.com/compose/startup-order/

Masalah menunggu database (misalnya) siap sebenarnya hanyalah sebagian dari masalah sistem terdistribusi yang jauh lebih besar. Dalam produksi, database Anda bisa menjadi tidak tersedia atau memindahkan host kapan saja. Aplikasi Anda harus tahan terhadap jenis kegagalan ini.

Untuk menangani ini, desain aplikasi Anda untuk mencoba membangun kembali koneksi ke database setelah terjadi kegagalan. Jika aplikasi mencoba kembali koneksi, akhirnya bisa terhubung ke database.

Solusi terbaik adalah melakukan pemeriksaan ini dalam kode aplikasi Anda, baik saat startup maupun setiap kali koneksi terputus karena alasan apa pun. Namun, jika Anda tidak membutuhkan tingkat ketahanan ini, Anda dapat mengatasi masalah tersebut dengan skrip pembungkus:

Dan selanjutnya menyebutkan berbagai skrip tunggu.

Saya bisa melakukan banyak hal. Tetapi karena ini hanya untuk pengembangan lokal, dan karena saya memiliki strategi lain untuk menangani pemeriksaan layanan produksi di k8s, saya lebih memilih implementasi lokal yang paling sederhana dan paling tidak menonjol, bukan saran umum dari orang-orang yang tidak mengetahui detail mengapa saya ' Saya ingin melakukan ini (misalnya masalah w / volume-mount untuk melakukan dev UI melalui server dev Webpack).

Bagaimanapun, itu hanyalah salah satu dari daftar panjang kasus penggunaan untuk fitur yang akan menjadi fitur ini yang harus diserahkan kepada kebijaksanaan pengguna.

Saya mendengar kemarahan diarahkan ke saya, dan saya mengerti mengapa akan membuat frustasi mendengar "nasihat" yang tidak diminta untuk pendekatan Anda. Tapi saya bahkan tidak yakin bagaimana cara meminta maaf; Saya mengutip teks dari URL yang Anda sendiri sebut sebagai "saran Docker sendiri", yang mengatakan _explicitly_ bahwa skrip tunggu adalah cara untuk "mengatasi masalah". Untuk apa nilainya, aku tetap minta maaf.

Anda tidak mendengar amarah. Anda mendengar nada jengkel seseorang yang, setelah mencari di Google apa yang seharusnya menjadi fitur yang cukup jelas, menemukan untaian seratus komentar di mana sekelompok pengelola terus-menerus melindungi dan menolak permintaan komunitas untuk fitur yang sepenuhnya valid.

Saya tidak membagikan pengalaman saya di sini karena saya ingin meminta maaf. Saya membagikannya hanya untuk menambahkan ke daftar panjang bukti bahwa pengguna Docker menginginkan fleksibilitas tambahan saat menggunakan compose .

Tentu saja, seperti alat apa pun, fleksibilitas itu datang bersamaan dengan potensi penyalahgunaan. Namun potensi yang sama, jika bukan potensi yang lebih buruk, ada ketika pengguna Anda harus menemukan solusi untuk dipecahkan untuk kasus penggunaan spesifik mereka yang dapat diselesaikan jauh lebih sederhana dengan hanya menambahkan fitur ini.

Selain itu, meminta maaf kepada pengguna Anda adalah penampilan yang buruk.

Saya bukan pengelola atau kontributor proyek ini, dan saya mohon maaf atas kebingungan apa pun di sana. Sepertinya bantuan kecil yang saya pikir bisa saya tawarkan ternyata tidak diinginkan dan tidak membantu, dan saya minta maaf karena telah membuang-buang waktu Anda.

Saya ingin fitur ini untuk wadah Go yang merupakan bagian dari aplikasi terdistribusi saya. Karena file .env perlu disertakan di root aplikasi Go, saya perlu membuat .env untuk itu ... Sedangkan, jika saya memiliki fitur ini, saya bisa dapatkan file .env level teratas saya dan salin file tersebut ke dalam container Go saat saya membuat. Itu berarti lebih sedikit hal yang perlu saya lacak ...

Solusi saya dapat membuat file ini melalui penampung Go Dockerfile atau cukup buat file .env untuk penampung itu. Tapi tetap saja, setiap kali saya menambahkan env var baru, saya perlu memperbaruinya, mungkin di dua tempat. Kasus penggunaan yang bagus di sini. Atau saya bisa menggunakan skrip shell untuk cp file untuk saya ...

1 untuk fitur COPY

kami sudah mencapai ini di Kubernetes dengan mobil samping, dan ada BANYAK kasus penggunaan. Ini BUKAN anti-pola, hanya salah satu fitur yang membuat buruh pelabuhan kembali menulis.

Mungkin saya melewatkan sesuatu, tetapi saat ini ketika kita membangun aplikasi kita selama 5 menit, folder build selama itu "terus berubah", dan aplikasi tidak akan mulai karena ketidakkonsistenan.
Saya lebih suka _copy_ folder build ke dalam container, jadi ketika saatnya untuk memulai container, itu akan mengambil alih internal. Dengan cara itu, aplikasi hanya offline selama satu detik atau lebih, ketika menghentikan / memulai penampung.

Bagaimana ini menjadi anti-pola ketika docker sudah mendukungnya? Masuk akal bahwa docker-compose mengikuti sebagai kegunaan dekat buruh pelabuhan - tidak melakukannya dengan sendirinya merupakan anti-pola.

Masalah dengan ini adalah bahwa hal ini sangat berpandangan pendek (karena itu disebut "anti-pola"), karena akan memaksa Anda untuk mengulangi operasi setiap kali kontainer dibuat ulang. Belum lagi fakta bahwa skalanya sangat buruk (bagaimana jika Anda memiliki 10 kontainer? 20? 100?)

Saya pikir itu terserah pengembang. Cukup menyalin satu file konfigurasi lokal memiliki overhead yang tidak signifikan. Jangan salahkan pisaunya.


PS Usecase saya; Saya ingin menambahkan konfigurasi ke container Nginx dalam proyek tanpa Dockerfiles.

Siapa yang tahu lagi.
Saya perlu menyiapkan proyek baru dan mencari yang baru
alat, Lando jauh lebih baik dari ini, itu gila. Seandainya saya menggunakannya
lebih cepat.
Lebih cepat, lebih mudah dipahami, lebih baik di luar kotak dukungan dan
tidak memiliki (mantan) pengelola / kontributor yang merendahkan.

@ chris-crone tentang komentar Anda ...

Untuk file konfigurasi atau data bootstrap, ada Docker Configs. Ini berfungsi mirip dengan rahasia tetapi dapat dipasang di mana saja. Ini didukung oleh Swarm, dan Kubernetes, tetapi tidak oleh docker-compose. Saya yakin bahwa kami harus menambahkan dukungan untuk ini dan itu akan membantu dengan beberapa kasus penggunaan yang tercantum dalam masalah ini.

Apakah buruh pelabuhan-menulis tertarik untuk mengimplementasikan dukungan config untuk parity dengan konfigurasi swarm?

Jika ada tiket untuk ini (atau jika saya perlu membuatnya juga tidak masalah), saya ingin berlangganan itu dan berhenti berlangganan dari api sampah ini. Secara pribadi saya akan menutup ini dan menautkannya, tapi itu hanya saya.

@harpratap Anda benar, tetapi kekurangannya adalah / folder_in_container tidak boleh ada atau harus kosong atau akan ditimpa. Jika Anda memiliki skrip bash sebagai titik masuk Anda, Anda dapat menghindari ini dengan menghubungkan file Anda ke direktori yang dimaksudkan semula setelah Anda membuat volume di / some_empty_location

1 untuk memiliki fungsi SALIN. Kasus penggunaan kami adalah untuk cepat berdiri di lingkungan pengembangan lokal dan menyalin konfigurasi untuk pengaturan dev.

Persis. Kami tidak semua menskalakan dengan cara yang sama. Perusahaan saya menggunakan SALT untuk membuat file .conf yang diperlukan untuk berbagai aplikasi. Satu build - dengan dasar-dasarnya - lalu docker-compose untuk membuat instance individual berdasarkan bagian uniknya: alamat MAC, IP, Port, Lisensi, Modul, dll. BISA dilakukan dari baris perintah - tetapi jauh lebih mudah dan lebih sedikit error rawan dari docker-compose.

Saya memiliki kasus penggunaan. Kami memiliki versi uji coba yang memerlukan penyiapan ssl. Sertifikat dihasilkan oleh layanan dalam pembuatan buruh pelabuhan ... Saya kemudian menambahkan sertifikat tersebut ke wadah klien ... jika saya memasang, saya kehilangan sertifikat yang ada dan saya tidak dapat memasukkannya ke dalam build buruh pelabuhan karena tidak belum ada.

Akibatnya saya harus menjalankan 2 pekerja galangan-tulis - 1 untuk menjalankan layanan untuk membuat sertifikat dan kemudian yang lain untuk membangun layanan dan menjalankan pengujian. Kacau.

Saya telah melihat banyak masalah di sini, di mana pengguna telah menyarankan banyak kasus penggunaan untuk suatu fitur, tetapi mereka ditolak karena menurut pengelola, ini adalah anti-pola, atau orang-orang tidak akan menggunakannya atau cerita lain .

Meskipun ini mungkin tampak seperti pola anti bagi satu orang, saya yakin 1000 orang yang meminta fitur tersebut, yang berpikir sebaliknya, perlu didengarkan juga. Jika beberapa bantuan diperlukan untuk mengembangkan fitur tersebut, saya pikir banyak orang dapat membantu.

Kasus penggunaan saya: Selain konfigurasi, saya memiliki beberapa perpustakaan (RPM) yang perlu saya instal di 5 wadah aplikasi Rails (Debian) saya. Versi Ruby / Rails berbeda, jadi tidak bisa menggunakan gambar dasar yang sama, jadi saya harus bisa menyimpan file di satu lokasi & menyalinnya ke wadah saat membangun, karena saya tidak ingin mengunduh 1,5GB data saat membangun.

@gauravanda

Kasus penggunaan saya: Selain konfigurasi, saya memiliki beberapa perpustakaan (RPM) yang perlu saya instal di 5 wadah aplikasi Rails (Debian) saya. Versi Ruby / Rails berbeda, jadi tidak bisa menggunakan gambar dasar yang sama, jadi saya harus bisa menyimpan file di satu lokasi & menyalinnya ke wadah saat membangun, karena saya tidak ingin mengunduh 1,5GB data saat membangun.

Pernahkah Anda melihat build multistage untuk ini? Saya pikir ini akan menjadi solusi yang lebih kuat.

Build multistage memungkinkan Anda menggunakan Dockerfile yang sama untuk beberapa image. Ini memungkinkan Anda untuk memfaktorkannya dan hanya menyertakan bit yang Anda perlukan di setiap gambar.

Contoh yang bagus adalah yang kami gunakan untuk membangun Docker Compose . Ini dibangun menggunakan Debian atau Alpine tetapi memungkinkan kita untuk memfaktorkan kode umum.

Dalam penyiapan kami, kami meningkatkan sekitar selusin simulator dengan pembuatan galangan kapal. Simulatornya sama, tetapi satu file init berbeda untuk setiap target dan file ini digunakan saat startup (dihapus saat server aktif dan berjalan). Apakah Anda benar-benar menyarankan agar kami membuat sekitar selusin gambar yang hampir identik hanya karena satu file berbeda? Itu tidak masuk akal IMO.

Dengan buruh pelabuhan, bendera --copy-service dapat digunakan untuk mencapai ini. Apakah ada alternatif lain yang bisa kita gunakan dengan docker-compose?

Hai @megaeater ,

kami meningkatkan sekitar selusin simulator dengan docker-compose. Simulatornya sama, tetapi satu file init berbeda untuk setiap target dan file ini digunakan saat startup (dihapus saat server aktif dan berjalan).

Ini adalah kasus penggunaan yang menarik; beberapa pertanyaan: Apakah simulator ini (atau bagiannya) pernah berjalan dalam produksi (yaitu: bukan pada mesin pengembang atau CI)? Jika kodenya terbuka (atau sistem serupa) dapatkah Anda menautkan saya ke kode itu sehingga saya dapat melihatnya?

Menarik juga untuk mengetahui mengapa Anda menginginkan salinan daripada mengikat pemasangan atau volume untuk file-file ini?

Apakah Anda benar-benar menyarankan agar kami membuat sekitar selusin gambar yang hampir identik hanya karena satu file berbeda? Itu tidak masuk akal IMO.

Gambar didasarkan pada lapisan karena alasan ini: semua gambar akan mereferensikan lapisan yang sama kecuali untuk lapisan yang menyertakan file berbeda.

Masalah dengan hal-hal seperti salinan pada pembuatan kontainer adalah hal itu membuat pengambilan kode yang sama dan menjalankannya dalam produksi menjadi sulit (yaitu: membutuhkan penulisan ulang logika utama) karena pola tersebut akan rapuh atau tidak mungkin dalam lingkungan yang diatur.

Ini bukan untuk mengatakan bahwa kita tidak boleh mengimplementasikan sesuatu seperti ini di Compose. Sebaliknya, ketika perubahan berarti bahwa pengguna tidak akan dapat menggunakan kembali sesuatu yang bekerja secara lokal dalam produksi, kami ingin berhenti sejenak dan melihat apakah ada cara yang lebih kuat untuk mencapai tujuan yang sama.

Terima kasih atas komentarnya @ chris-crone

Kami tidak menjalankan buruh pelabuhan dalam produksi, itu hanya untuk tujuan pengembangan. Masalah dengan menggunakan volume (jika saya memahaminya dengan benar) adalah simulator (pihak ke-3) memiliki skrip startup ini yang menghapus file saat startup. Eksekusi skrip berhenti jika penghapusan gagal, jadi kita perlu memasangnya sebagai rw. Dan jika penghapusan file diperbolehkan, kita perlu memiliki mekanisme untuk membuat direktori sementara untuk memasok file-file ini sehingga aslinya tidak terhapus. Jadi kita perlu memiliki semacam skrip asing untuk meningkatkan komposisi di atas penulisan galangan.

@ chris-crone Terima kasih atas tautannya. Saya akan melihat dan melihat apakah itu berhasil untuk kita 👍

Hai @ chris-crone Saya mencoba menggunakan build Multi Stage, dan itu membantu kami menyimpan library / config hanya di 1 lokasi dan menyalinnya, tetapi sekarang ada masalah dengan .dockerignore diabaikan, di mana pun Saya menempatkannya.

Ini berfungsi ketika saya hanya menggunakan Docker dengan opsi DOCKER_BUILDKIT , tetapi tidak berfungsi saat menggunakan docker-compose, mencoba COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build , tetapi masih tidak berhasil. Ada ide?

Saya bertanya-tanya, jika ada opsi untuk menentukan di mana mencari .dockerignore dalam penulisan, ketika saya menemukan masalah ini https://github.com/docker/compose/issues/6022 , yang lagi-lagi, ditutup, karena 1 kontributor menganggap ini tidak berguna.

Ini cukup membuat frustrasi jika saya jujur ​​di sini !!

Ini sangat penting di MacOS, karena membuat siklus pengembangan Anda sedekat mungkin dengan produksi adalah yang terpenting; jelas untuk praktik Pengiriman Berkelanjutan yang tepat. misalnya, membangun penampung, tetapi kemudian mengikatkan versi baru perangkat lunak yang saat ini Anda kerjakan ke dalam penampung untuk menghemat waktu siklus pembuatan. Sayangnya, dudukan pengikat sangat mahal, 3 hingga 5 kali lebih lambat.

Sebagai contoh, waktu startup tomcat adalah sekitar 3 detik untuk aplikasi saya dalam sebuah wadah. Tambahkan bind mount ~ / .bash_history dan itu 4s. Tambahkan bind mount dari aplikasi saya dan biasanya sekitar 18-20-an. Di Linux, kinerja bind mount seperti sistem file lokal, tetapi tidak di MacOS. Skala itu menjadi 100 kali per hari dan itu signifikan.

Itu tidak termasuk kelambatan yang berlanjut saat mengakses aplikasi untuk pertama kalinya; sampai file kode di-cache. Bagi saya, itu berarti 3 menit, termasuk jeda melalui internet yang menghubungkan ke db oracle monolitik untuk mengubah frasa kecil menjadi sesuatu yang lain, dan lihat apakah masih terlihat baik-baik saja. Sialan covid-19, lol.

Idealnya, saya ingin menjalankan kembali docker-compose dan "mengupdate" aplikasi saya di container yang sedang berjalan, dan meminta tomcat untuk memuat ulang. Saya dapat menggunakan pengelola kucing jantan untuk mengunggah perubahan, tetapi kami juga memiliki aplikasi back-end yang tidak menggunakan wadah terkelola apa pun, jadi kami kemudian harus menggunakan solusi berbeda untuk itu.

Alangkah baiknya jika docker-compose juga diarahkan untuk pengembangan, bukan hanya penerapan produksi.

Kasus penggunaan ini relevan dengan diskusi: https://github.com/docker/compose/issues/3593#issuecomment -637634435

@ chris-cr

@gauravanda

Kasus penggunaan saya: Selain konfigurasi, saya memiliki beberapa perpustakaan (RPM) yang perlu saya instal di 5 wadah aplikasi Rails (Debian) saya. Versi Ruby / Rails berbeda, jadi tidak bisa menggunakan gambar dasar yang sama, jadi saya harus bisa menyimpan file di satu lokasi & menyalinnya ke wadah saat membangun, karena saya tidak ingin mengunduh 1,5GB data saat membangun.

Pernahkah Anda melihat build multistage untuk ini? Saya pikir ini akan menjadi solusi yang lebih kuat.

Build multistage memungkinkan Anda menggunakan Dockerfile yang sama untuk beberapa image. Ini memungkinkan Anda untuk memfaktorkannya dan hanya menyertakan bit yang Anda perlukan di setiap gambar.

Contoh yang bagus adalah yang kami gunakan untuk membangun Docker Compose . Ini dibangun menggunakan Debian atau Alpine tetapi memungkinkan kita untuk memfaktorkan kode umum.

Build multistage memang keren, tetapi mereka memiliki masalah sendiri, untuk satu build Anda harus menjalankan semua tahapan dalam konteks yang sama, yang tidak selalu memungkinkan. Juga, sejauh yang saya tahu, Anda tidak dapat dengan mudah menggunakan COPY --from dengan gambar yang ditentukan di Dockerfile lain dan dibangun dengan docker-compose build (Saya berasumsi Anda dapat melakukannya dengan membangun dan menandai mereka secara manual).

COPY itu sendiri sangat terbatas karena Anda hanya dapat mengimpor dari konteks build Anda. docker cp dapat menyalin dari mana saja ke mana saja, kecuali ia tidak dapat menyalin antara gambar dan wadah (semacam COPY --from ).

Kasus penggunaan saya sendiri sedikit berbeda (selain menyalin file konfigurasi hanya baca, mount volume lokal bukanlah ide terbaik saat Anda menerapkan ke komputer lain) dan saya akan mengatakan bahwa apa yang saya lakukan sekarang adalah antipattern ... . Saya berpotensi memiliki beberapa gambar berbeda yang di build menghasilkan kumpulan aset JS + HTML + yang dikompilasi dan dikecilkan (pikirkan aplikasi sudut kecil), dan satu server nginx yang melayani semuanya (nb dibangun dari gambar khusus karena plugin).

Saat ini, yang harus saya lakukan adalah menyalin paket "menyebarkan" dari gambar "membangun" saat startup. Idealnya, ini harus dilakukan pada pembuatan container, atau pada build, tetapi build terakhir akan memerlukan pembuatan gambar lain di atas "modded nginx".

Gambar tata letak proyek berikut (subproyek mungkin tinggal di repositori terpisah dan tidak tahu satu sama lain):

app1/
  src/
    ...
  Dockerfile
app2/
  src/
    ...
  Dockerfile
app3/
  src/
    ...
  Dockerfile
nginx/
  ...
  Dockerfile
docker-compose.yml

Setiap file app{1,2,3}/Dockerfile berisi target / tahap build yang membangun aplikasi menjadi /usr/src/app/dist . nginx/Dockerfile memiliki satu tahap dan membuat gambar yang mirip dengan nginx/nginx , tetapi dengan semua plugin yang diperlukan (tanpa konfigurasi).

docker-compose.yml:

version: '3.8'
services:
  app1-build:
    build:
      context: app1/
      target: build
    image: app1-build
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        rm -vfr /dist-volume/app1 \
        && cp -vr /usr/src/app/dist /dist-volume/app1 \
        && echo "Publishing successful"
    volumes:
      - 'dist:/dist-volume'

  app2-build:
    build:
      context: app2/
      target: build
    image: app2-build
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        rm -vfr /dist-volume/app3 \
        && cp -vr /usr/src/app/dist /dist-volume/app3 \
        && echo "Publishing successful"
    volumes:
      - 'dist:/dist-volume'

  #... same thing for app3-build

  nginx:
    build:
      context: nginx/
    image: my-nginx
    volumes:
      - 'dist:/var/www'
      - # ... (config files etc)

volumes:
  dist:

Sekarang, ini jelas tidak ideal, setiap gambar pembuatan aplikasi tidak perlu dijalankan dan diselesaikan dengan cepat, gambar yang diterapkan berada pada volume bersama (saya berasumsi ini memiliki dampak kinerja negatif, tetapi saya belum dapat memverifikasinya). Jika copy atau copy_from adalah opsi tulis-galangan, hal yang sama dapat ditulis sebagai:

version: '3.8'
services:
  # assuming the images have default entrypoint and cmd combination that immediately returns with success.
  app1-build:
    build:
      context: app1/
      target: build
    image: app1-build

  #... same thing for app2-build app3-build

  nginx:
    build:
      context: nginx/
    image: my-nginx
    copy:
      - from: app1-build  # as image or service, both have their pros and cons, service would mean an image associated with this service
         source: /usr/src/app/dist
         destination: /var/www/app1
      - from: app2-build
         source: /usr/src/app/dist
         destination: /var/www/app2
      - from: app3-build
         source: /usr/src/app/dist
         destination: /var/www/app3
    volumes:
      - # ... (config files etc)

Kasus penggunaan saya tidak ada dalam langkah pembuatan atau langkah permulaan. Saya mengambil file yang dihasilkan di dalam satu kontainer atau semua kontainer layanan, kontainer ini dijalankan pada Mesin Docker jarak jauh. Sejauh ini saya menemukan diri saya melakukan sesuatu seperti docker-compose ps -qa <service> | xargs -i docker cp {}:<there> <here> . Saya hanya berharap saya bisa tetap menggunakan docker-compose secara unik di skrip saya.

@ chris-cr

Menarik juga untuk mengetahui mengapa Anda menginginkan salinan daripada mengikat pemasangan atau volume untuk file-file ini?

Apakah Anda menikmati penyerangan sendiri? Jika demikian, saya merekomendasikan menjalankan aplikasi menggunakan bind mount di MacOS. 🤣 Lihat posting saya sebelumnya untuk detailnya.

Ini bukan untuk mengatakan bahwa kita tidak boleh mengimplementasikan sesuatu seperti ini di Compose. Sebaliknya, ketika perubahan berarti bahwa pengguna tidak akan dapat menggunakan kembali sesuatu yang bekerja secara lokal dalam produksi, kami ingin berhenti sejenak dan melihat apakah ada cara yang lebih kuat untuk mencapai tujuan yang sama.

@ chris-crone Saya rasa ini adalah sentimen yang bagus, karena terlalu sering orang menerapkan anti-pola untuk buruh pelabuhan, seperti tidak mengelola konfigurasi dan data secara singkat.

Saya ingin tahu apakah kami bisa membuat buruh pelabuhan dan Apple bekerja sama untuk memperbaiki masalah kinerja dengan bind mount. Bagi saya setidaknya, saya tidak membutuhkan lagi opsi docker compose cp, karena saya akan menggunakan bind mounts untuk pengembangan. Saat ini meskipun terlalu menyakitkan untuk menggunakan bind mount. Saya dapat beralih ke mesin virtual dengan Linux, karena Mac saya hanya byte.

@bayu_joo

Kami tidak menjalankan buruh pelabuhan dalam produksi, itu hanya untuk tujuan pengembangan. Masalah dengan menggunakan volume (jika saya memahaminya dengan benar) adalah simulator (pihak ke-3) memiliki skrip startup ini yang menghapus file saat startup. Eksekusi skrip berhenti jika penghapusan gagal, jadi kita perlu memasangnya sebagai rw. Dan jika penghapusan file diperbolehkan, kita perlu memiliki mekanisme untuk membuat direktori sementara untuk memasok file-file ini sehingga aslinya tidak terhapus. Jadi kita perlu memiliki semacam skrip asing untuk meningkatkan komposisi di atas penulisan galangan.

Hmm .. Jika Anda dapat terlibat dengan vendor simulator, menurut saya itulah cara terbaik untuk memperbaiki masalah ini. Anda mungkin bisa mengatasi ini dengan skrip entrypoint untuk simulator yang memindahkan file sesuai kebutuhan; diberikan ini akan menjadi berantakan.

@gauravanda

itu membantu kami menjaga perpustakaan / konfigurasi di 1 lokasi saja dan menyalinnya, tetapi sekarang ada masalah dengan .dockerignore diabaikan, di mana pun saya meletakkannya.
Ini berfungsi ketika saya hanya menggunakan Docker dengan opsi DOCKER_BUILDKIT , tetapi tidak berfungsi saat menggunakan docker-compose, mencoba COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build , tetapi masih tidak berhasil. Ada ide?

Build multistage senang membantu! Versi Docker dan docker-compose apa yang Anda gunakan? Saya akan mencoba dengan yang terbaru dan melihat apakah masalahnya masih ada. Itu harus menghormati file .dockerignore.

@ Marandil , sepertinya docker build tidak menangani struktur proyek Anda (yaitu: struktur direktori) yang merupakan masalahnya. Anda mungkin dapat menggunakan sesuatu seperti docker buildx bake (https://github.com/docker/buildx) untuk menyelesaikan kasus penggunaan ini. Note buildx sedang dikerjakan jadi belum super stabil tetapi bertujuan untuk menyelesaikan beberapa dari apa yang Anda pukul.

@itscaro , terima kasih atas masukan Anda! Apa yang kita lakukan secara internal untuk menghasilkan sesuatu dalam kontainer adalah menggunakan docker build untuk mengeluarkan hasil dari gambar FROM scratch . Ini hanya berfungsi jika Anda memerlukan satu keluaran penampung.

@TrentonAdams kami telah berupaya meningkatkan kinerja sistem file untuk Docker Desktop tetapi ini rumit. Masalah yang mendasarinya adalah melintasi batas VM. Bit berbagi file baru-baru ini telah ditulis ulang (Anda dapat mengaktifkan pengalaman baru menggunakan sakelar "Gunakan gRPC FUSE untuk berbagi file" di preferensi) dan ini akan menyelesaikan beberapa masalah penggunaan CPU yang tinggi yang telah dilihat orang. Kami memiliki beberapa dokumentasi tentang penyetelan kinerja di sini dan di sini .

@ chris-cr

@ Marandil , sepertinya docker build tidak menangani struktur proyek Anda (yaitu: struktur direktori) yang merupakan masalahnya. Anda mungkin dapat menggunakan sesuatu seperti docker buildx bake (https://github.com/docker/buildx) untuk menyelesaikan kasus penggunaan ini. Note buildx sedang dikerjakan jadi belum super stabil tetapi bertujuan untuk menyelesaikan beberapa dari apa yang Anda pukul.

Terima kasih, saya akan memeriksa docker buildx bake . Kelihatannya menjanjikan, tapi saya tidak bisa menemukan referensi atau dokumentasi yang bagus untuk itu, dan halaman di docs.docker.com agak kosong (lihat https://docs.docker.com/engine/reference/commandline/buildx_bake /). Sejauh ini saya menemukan https://twitter.com/tonistiigi/status/1290379204194758657 merujuk pada beberapa contoh (https://github.com/tonistiigi/fsutil/blob/master/docker-bake.hcl, https: // github .com / tonistiigi / binfmt / blob / master / docker-bake.hcl), yang mungkin merupakan titik awal yang baik, tetapi bukan referensi yang baik.

@TrentonAdams kami telah berupaya meningkatkan kinerja sistem file untuk Docker Desktop tetapi ini rumit. Masalah yang mendasarinya adalah melintasi batas VM. Bit berbagi file baru-baru ini telah ditulis ulang (Anda dapat mengaktifkan pengalaman baru menggunakan sakelar "Gunakan gRPC FUSE untuk berbagi file" di preferensi) dan ini akan menyelesaikan beberapa masalah penggunaan CPU yang tinggi yang telah dilihat orang. Kami memiliki beberapa dokumentasi tentang penyetelan kinerja di sini dan di sini.

@ chris-crone Hell ya, terima kasih banyak! Ada peningkatan 3-4 detik dengan opsi baru, dan menggunakan "cache" memberi saya kinerja yang sama seperti berjalan di luar penampung, jadi ini BESAR bagi saya. Saya melihat waktu mulai dari 2800 md untuk aplikasi kita, jadi itu bukan lagi 11-18. YAY! Saya tidak membutuhkan apa pun selain cache, karena saya hanya membuat ulang container setiap saat.

@ chris-crone Adakah tempat saya harus memposting hal-hal kinerja untuk membantu penyetelan kinerja dan umpan balik pada MacOS? Saya bertanya-tanya mengapa container yang baru dimulai dengan bind mount akan menjadi lambat jika tidak menggunakan cached . Pasti ada hal aneh di mana ia bolak-balik memeriksa setiap file saat startup apakah mereka sinkron, bahkan ketika itu baru?

Kasus penggunaan: Saya menjalankan wadah dan itu memodifikasi file (khususnya, Keycloak memodifikasi file konfigurasinya berdasarkan variabel lingkungan dll). Saya ingin salinan file itu di disk lokal saya sehingga saya dapat memeriksa hasil modifikasi itu, dan melacak kemajuan saya dari waktu ke waktu saat saya memodifikasi skrip penampung. Saat ini, saya perlu mencari ID penampung baru setiap kali sehingga saya dapat menggunakan docker cp .

Kasus penggunaan:
berkembang di buruh pelabuhan.
saya perlu menyebarkan kembali file kunci saya ke mesin host atau akan ditimpa ketika kontainer memasang folder proyek.

Kasus penggunaan: Saya perlu menyalin file yang berisi kunci rahasia. Aplikasi yang berjalan di dalam container membaca file tersebut ke dalam memori dan menghapusnya dari disk.

Kasus penggunaan: Saya menjalankan pengujian unit c ++ dalam kontainer buruh pelabuhan. Saya hanya ingin menyalin kode ke gambar yang ada setiap kali dijalankan.

1) Melakukan ini dengan file dok terpisah COPY berarti kode akan ditulis ke gambar baru yang tidak perlu dan saya perlu menghapus gambar itu untuk memastikan proses selanjutnya membuat gambar baru dengan kode terbaru.

2) Melakukan ini dengan docker-compose volumes yaml config berarti Docker menggunakan kode sumber sebagai root:root (benar-benar mematikan IDE saya dari melakukan pengeditan sampai saya melakukannya kembali!)

@ shin- apakah saya mengikuti anti-pola dengan menjalankan pengujian unit dalam wadah? Apa cara non-anti-pola Anda akan menyelesaikan ini?

.... Saya tetap menggunakan opsi 1 karena ini adalah yang paling tidak menyakitkan. Tapi saya melihat docker-compose mendukung konfigurasi salinan sebagai peningkatan yang luar biasa! setidaknya untuk alur kerja ini!

@soulseekah Bukankah menggunakan rahasia dalam menulis lebih baik untuk kasus penggunaan itu?

Saya menemukan solusi untuk itu yang berhasil untuk saya:

  1. Buat Dockerfile dengan
    COPY a_filename .
  2. Bangun image menggunakan Dockerfile
    docker build -t myproject:1.0 .
  3. Edit docker-compose untuk menggunakan gambar yang baru saja Anda buat
version: "3.7"
services:
  app:
    image: myproject:1.0
    ports:
      - 3000:3000
    networks:
       - mynetwork
       - internal
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: not_so_secret_password # don't do this 
      # https://diogomonica.com/2017/03/27/why-you-shouldnt-use-env-variables-for-secret-data/
      MYSQL_DB: appdb
    deploy:
      resources:
        limits:
          cpus: '0.75'
          memory: 100M

Bukan solusi yang sempurna, tetapi berfungsi dalam kasus penggunaan saya.

@soulseekah Bukankah menggunakan rahasia dalam menulis lebih baik untuk kasus penggunaan itu?

Sayangnya itu membutuhkan kawanan terakhir kali saya mencoba :(

@soulseekah Bukankah menggunakan rahasia dalam menulis lebih baik untuk kasus penggunaan itu?

Sayangnya itu membutuhkan kawanan terakhir kali saya mencoba :(

@soulseekah Mungkin menggunakan solusi yang saya gunakan (di atas Anda)?

@ChristophorusReyhan masalah dengan penyelesaian itu ditunjukkan dalam komentar

Melakukan hal ini dengan COPY file dok terpisah berarti kode akan ditulis ke gambar baru yang tidak perlu dan saya perlu menghapus gambar itu untuk memastikan proses selanjutnya membuat gambar baru dengan kode terbaru.

Sementara solusi yang berfungsi, ini dapat menyebabkan beberapa perawatan yang tidak diinginkan. Misalnya, untuk membersihkan gambar yang tidak diinginkan _ sambil juga mempertahankan gambar apa pun yang Anda pedulikan_:

docker-compose up && docker-compose down --rmi local

Tapi pastikan semua gambar yang Anda pedulikan memiliki tag khusus dan gambar uji / tiruan tidak

Apakah halaman ini membantu?
0 / 5 - 0 peringkat