Apa tujuan dari "buruh pelabuhan membangun - tarik"?

17

Saat membangun gambar buruh pelabuhan yang biasa Anda gunakan docker build ..

Tetapi saya telah menemukan bahwa Anda dapat menentukan --pull, sehingga seluruh perintah akan terlihat sepertidocker build --pull .

Saya tidak yakin tentang tujuan --pull. Dokumentasi resmi Dockers mengatakan "Selalu berusaha untuk menarik versi yang lebih baru dari gambar", dan saya tidak yakin apa artinya ini dalam konteks ini.

Anda menggunakan docker builduntuk membangun gambar baru, dan akhirnya menerbitkannya di suatu tempat ke registri wadah. Mengapa Anda ingin menarik sesuatu yang belum ada?

Saya mengharapkan sesuatu yang "sederhana" seperti ini dapat dengan mudah ditemukan di web, tetapi sepertinya tidak ada yang memiliki pertanyaan yang sama seperti ini. Satu-satunya hit nyata di google mengacu pada dokumen resmi Dockers, yang saya (seperti yang dinyatakan di atas) tidak mengerti.

Terima kasih atas bantuan Anda!

Jim Aho
sumber

Jawaban:

17

itu akan menarik versi terbaru dari gambar dasar apa pun alih-alih menggunakan kembali apa pun yang sudah Anda beri tag secara lokal

misalnya mengambil gambar berdasarkan tag bergerak (seperti ubuntu:bionic). upstream melakukan perubahan dan membangun kembali ini secara berkala tetapi Anda mungkin memiliki gambar yang lama berbulan-bulan secara lokal. buruh pelabuhan akan dengan senang hati membangun melawan pangkalan lama. --pullakan menarik sebagai efek samping sehingga Anda membangun terhadap gambar dasar terbaru

itu ~ biasanya praktik terbaik untuk menggunakannya untuk mendapatkan perbaikan keamanan hulu sesegera mungkin (alih-alih menggunakan gambar basi, berpotensi rentan). meskipun Anda harus menukarkan perubahan yang melanggar (dan jika Anda menggunakan tag yang tidak dapat diubah maka itu tidak membuat perbedaan)

Anthony Sottile
sumber
Ini adalah penjelasan yang sangat bagus dengan ubuntu:bionicgambar, karena (jelas) tidak memiliki versi yang dilampirkan, tetapi akan tetap berbeda setiap kali mereka mempublikasikan gambar baru. Semua masuk akal. Terima kasih!
Jim Aho
1
Jika gambar dasar akan menjadi ubuntu:0.1.0contoh, dan mereka menerbitkan gambar baru tetapi dengan versi yang sama yaitu ubuntu:0.1.0- apakah ini berarti docker build --pullakan mengunduh ulang seluruh gambar baru lagi? (yang akan menjadi pilihan kebanyakan orang, saya kira)
Jim Aho
Saya berharap seseorang akan mengklarifikasi pertanyaan terakhir dari @JimAho karena itulah yang ingin saya pahami lebih baik. Jika gambar baru saja didorong, dan tidak ada lagi yang berubah, maka apakah ini tidak dibangun kembali?
learning2learn
2
@ learning2learn jawabannya adalah ya, tag gambar buruh pelabuhan hanyalah sebuah string sehingga "0.1.0" tidak berbeda dengan contoh dalam jawaban "bionic"
Anthony Sottile
@AnthonySottile Terima kasih. sangat banyak.
learning2learn
1

Jawaban sederhana docker builddigunakan untuk membangun dari dockerfile lokal. docker pulldigunakan untuk menarik dari hub buruh pelabuhan. Jika Anda menggunakan buruh pelabuhan tanpa file buruh pelabuhan itu membuat kesalahan.

Ketika Anda menentukan --pullatau :latestburuh pelabuhan akan mencoba mengunduh versi terbaru (jika ada)

Pada dasarnya, jika Anda menambahkan --pull, itu akan mencoba untuk menarik versi terbaru setiap kali dijalankan.

DuDoff
sumber
Jika Anda memiliki gambar berlapis - akan itu menarik semua dari mereka selalu ?
Jim Aho
Jika Anda memiliki gambar berlapis, beberapa akan di-cache di mesin (lapisan yang lebih tua) dan apa pun lapisan baru akan ditarik.
DuDoff
0

Docker memungkinkan melewati  --pull bendera  docker build, misalnya  docker build . --pull -t myimage. Ini adalah cara yang disarankan untuk memastikan bahwa build selalu menggunakan gambar kontainer terbaru meskipun versi tersedia secara lokal. Namun satu poin tambahan yang layak disebutkan:

Untuk memastikan bahwa bangunan Anda sepenuhnya dibangun kembali, termasuk memeriksa gambar dasar untuk pembaruan, gunakan opsi berikut saat membangun:

--no-cache - Ini akan memaksa pembangunan kembali lapisan yang sudah tersedia.

Perintah penuh akan terlihat seperti ini:

docker build . --pull --no-cache --tag myimage:version

Opsi yang sama tersedia untuk docker-compose:

docker-compose build --no-cache --pull

Selamat tinggal untuk saat ini
sumber
Dalam penggunaan normal Anda tidak perlu --no-cache. Jika gambar dasar diperbarui (dan --pullmendapatkan versi baru) yang secara otomatis membatalkan cache; sama jika Anda COPYberbeda kode yang akan membatalkan cache. Satu-satunya hal yang biasanya akan memengaruhi adalah jika Anda melakukan sesuatu seperti apt-get installpaket yang dihosting jaringan, dalam hal ini --no-cacheakan menyebabkannya memeriksa versi yang lebih baru bahkan jika gambar dasar belum diperbarui.
David Maze