Saya ingin membuat image buruh pelabuhan untuk proyek Linkurious di github, yang membutuhkan database Neo4j, dan Node.js untuk dijalankan.
pendekatan pertama saya adalah mendeklarasikan gambar dasar untuk gambar saya, yang berisi Neo4j. Dokumen referensi tidak mendefinisikan "gambar dasar" dengan cara yang berguna:
Gambar dasar: Gambar yang tidak memiliki induk adalah gambar dasar
dari mana saya membaca bahwa saya mungkin hanya memiliki gambar dasar jika gambar itu tidak memiliki gambar dasar itu sendiri.
tapi apa itu gambar dasar? apakah ini berarti bahwa jika saya mendeklarasikan neo4j / neo4j dalam direktif FROM, bahwa ketika image saya dijalankan, database neo akan secara otomatis berjalan dan tersedia dalam container di port 7474?
membaca referensi Docker (lihat: https://docs.docker.com/reference/builder/#from ) Saya melihat:
FROM dapat muncul beberapa kali dalam satu Dockerfile untuk membuat banyak gambar. Cukup buat catatan keluaran ID gambar terakhir dengan komit sebelum setiap perintah FROM baru.
apakah saya ingin membuat banyak gambar? sepertinya yang saya inginkan adalah memiliki satu gambar yang berisi konten gambar lain misalnya neo4j dan node.js
Saya tidak menemukan arahan untuk mendeklarasikan dependensi di manual referensi. apakah tidak ada ketergantungan seperti di RPM di mana untuk menjalankan gambar saya konteks panggilan harus terlebih dahulu menginstal gambar yang dibutuhkannya?
Saya bingung...
sumber
FROM
fileDockerfile
. Lihat jawaban saya yang sudah diedit di bawah.Jawaban:
Satu set file, plus
EXPOSE
port,ENTRYPOINT
danCMD
.Anda dapat menambahkan file dan membuat gambar baru berdasarkan gambar dasar tersebut, dengan yang baru
Dockerfile
dimulai denganFROM
petunjuk: gambar yang disebutkan setelahnyaFROM
adalah "gambar dasar" untuk gambar baru Anda.Hanya jika Anda tidak menimpa
CMD
danENTRYPOINT
.Tetapi gambar itu sendiri sudah cukup: Anda akan menggunakan a
FROM neo4j/neo4j
jika Anda harus menambahkan file yang terkaitneo4j
untuk penggunaan khusus Andaneo4j
.Jangan: ada usulan untuk tetap menghapus "fitur" itu ( masalah 13026 )Issue 14412 menyebutkan:
Perbarui Mei 2017 (18 bulan kemudian), dengan buruh pelabuhan (moby) 17.05-ce .
Beberapa FROM dapat digunakan dalam satu Dockerfile.
Lihat " Pola pembangun vs. bentukan multi-tahap di Docker " (oleh Alex Ellis ) dan PR 31257 oleh Tõnis Tiigi .
Sebelum:
Setelah:
Bagian pertama dari Dockerfile:
Bagian kedua dari Dockerfile yang sama (!):
Hasilnya akan menjadi dua gambar, satu untuk membangun, satu dengan hanya aplikasi yang dihasilkan (jauh, jauh lebih kecil)
sumber
Jawaban pertama terlalu rumit, bersejarah, dan tidak informatif untuk selera saya.
Sebenarnya cukup sederhana. Docker menyediakan fungsionalitas yang disebut multi-stage build , ide dasarnya di sini adalah,
Mari kita mulai dengan yang pertama. Sangat sering dengan sesuatu seperti Debian yang akan Anda lihat.
Kami dapat menjelaskan semua ini dengan istilah di atas. Perintah di atas dirangkai bersama sehingga mewakili satu perubahan tanpa diperlukan Gambar perantara. Jika ditulis seperti ini,
Ini akan menghasilkan 3 Gambar perantara sementara. Setelah direduksi menjadi satu gambar, ada satu masalah yang tersisa:
apt-get clean
tidak membersihkan artefak yang digunakan dalam penginstalan. Jika pengelola Debian menyertakan skrip yang mengubah sistem yang dimodifikasi itu juga akan hadir dalam solusi akhir (lihatpepperflashplugin-nonfree
contoh seperti itu).Dengan menggunakan build multi-tahap, Anda mendapatkan semua manfaat dari satu tindakan yang diubah, tetapi ini akan mengharuskan Anda untuk memasukkan ke daftar putih dan menyalin file yang dimasukkan dalam gambar sementara secara manual menggunakan
COPY --from
sintaks yang didokumentasikan di sini. Selain itu, ini adalah solusi hebat di mana tidak ada alternatif (sepertiapt-get clean
), dan Anda akan memiliki banyak file yang tidak diperlukan di gambar akhir Anda.Lihat juga
sumber
FROM
pada dasarnya adalah deklarasi namespace. Kualifikasi di sana lebih seperti perpanjangan dari warisan. Anda dapat mendeklarasikan beberapa namespace. Dan masing-masing namespace tersebut dapat memperluas satu namespace lainnya. @ekkis Jika jawaban lain berhasil untuk Anda, maka tetaplah dengan itu.