Bagaimana mendapatkan komposisi buruh pelabuhan agar selalu membuat ulang wadah dari gambar segar?

199

Gambar docker saya dibuat di server Jenkins CI dan didorong ke Docker Registry pribadi kami. Tujuan saya adalah untuk menyediakan lingkungan dengan komposisi buruh pelabuhan yang selalu memulai kondisi gambar yang awalnya dibuat.

Saat ini saya menggunakan docker-compose 1.3.2 serta 1.4.0 pada mesin yang berbeda tetapi kami juga menggunakan versi yang lebih lama sebelumnya.

Saya selalu menggunakan docker-compose pull && docker-compose up -dperintah untuk mengambil gambar baru dari registri dan memulai. Saya percaya perilaku yang saya sukai berfungsi seperti yang diharapkan hingga titik waktu tertentu, tetapi sejak itu docker-compose upmulai menjalankan kembali kontainer yang dihentikan sebelumnya alih-alih memulai gambar yang dibuat semula setiap saat.

Apakah ada cara untuk menghilangkan perilaku ini? Mungkinkah itu yang ditransfer dalam file konfigurasi docker-compose.yml untuk tidak bergantung "tidak lupa" sesuatu pada baris perintah pada setiap doa?

ps. Selain menemukan cara untuk mencapai tujuan saya, saya juga ingin tahu sedikit lebih banyak tentang latar belakang perilaku ini. Saya pikir ide dasar Docker adalah membangun infrastruktur yang tidak berubah. Tingkah laku docker-compose saat ini tampaknya jelas berbenturan dengan pendekatan ini .. atau apakah saya kehilangan beberapa poin di sini?

Kristof Jozsa
sumber

Jawaban:

233

docker-compose up --force-recreateadalah salah satu pilihan, tetapi jika Anda menggunakannya untuk CI, saya akan mulai membangun dengan docker-compose rm -fberhenti dan menghapus wadah dan volume (kemudian ikuti dengan menarik dan ke atas).

Inilah yang saya gunakan:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

Alasan wadah diciptakan kembali adalah untuk menjaga volume data apa pun yang mungkin digunakan (dan itu juga membuat upjauh lebih cepat).

Jika Anda melakukan CI, Anda tidak menginginkannya, jadi hapus saja semua yang Anda inginkan.

Perbarui: gunakan up --buildyang ditambahkan pada docker-compose1.7

dnephin
sumber
1
Ya, sebenarnya ini yang saya lakukan di CI juga. Tidak yakin mengapa saya tidak menyebutkan itu ...
Adrian Mouat
@dnephin docker-compose run -dtidak ada? Anda ingin mengatakan docker-compose up -dtidak?
Guillaume Vincent
2
jika Anda berlari docker-compose pullsebelum docker-compose rm -fAnda dapat menghemat lebih banyak waktu
stephanlindauer
2
Apa yang dilakukan flag -d di bagian akhir?
David J. Davis
3
"-d Mode terpisah: Jalankan kontainer di latar belakang,"
dnephin
135

Satu-satunya solusi yang bekerja untuk saya adalah perintah ini:

docker-compose build --no-cache

Ini akan secara otomatis menarik gambar baru dari repo dan tidak akan menggunakan versi cache yang dibuat ulang dengan parameter apa pun yang telah Anda gunakan sebelumnya.

davidbonachera
sumber
1
Selain itu, di bawah Windows 10 dapat membantu mengatur server DNS di pengaturan dari Otomatis ke Tetap atau dari Tetap ke Otomatis.
qräbnö
2
Bekerja untuk saya di gedung OS X dengan versi docker-comopse 2.
RoboBear
1
Bekerja pada buruh pelabuhan OS X.
HelloWorld
55

Dengan dokumentasi resmi saat ini ada jalan pintas yang berhenti dan menghapus kontainer, jaringan, volume, dan gambar yang dibuat oleh, jika mereka sudah berhenti atau dihapus sebagian dan seterusnya, maka itu akan melakukan trik juga:

docker-compose down

Kemudian jika Anda memiliki perubahan baru pada gambar Anda atau gunakan Dockerfiles:

docker-compose build --no-cache

Akhirnya:docker-compose up

Dalam satu perintah: docker-compose down && docker-compose build --no-cache && docker-compose up

Victor Timoftii
sumber
2
docker-compose build --no-cachediperlukan hanya jika ada perubahan pada Dockerfiles.
Victor Timoftii
Memang, Victor. Terima kasih! Saya pikir itu juga perlu setelah memperbarui modul / aplikasi yang dieksekusi ketika wadah dimulai. Untuk kasus ini, sebelum menjalankan docker-compose up, perlu untuk membangun kembali layanan dengan docker-compose build.
ivanleoncz
18

Anda dapat melewati --force-recreateke docker compose up, yang harus menggunakan kontainer segar.

Saya pikir alasan di balik menggunakan kembali wadah adalah untuk melestarikan perubahan apa pun selama pengembangan. Perhatikan bahwa Tulisan melakukan sesuatu yang mirip dengan volume, yang juga akan bertahan di antara rekreasi wadah (wadah yang dibuat ulang akan menempel pada volume pendahulunya). Ini dapat membantu, misalnya, jika Anda memiliki wadah Redis yang digunakan sebagai cache dan Anda tidak ingin kehilangan cache setiap kali Anda melakukan perubahan kecil. Di lain waktu itu hanya membingungkan.

Saya tidak percaya ada cara apa pun Anda bisa memaksakan ini dari file Menulis.

Bisa dibilang itu berbenturan dengan prinsip-prinsip infrastruktur yang tidak dapat diubah. Argumen tandingannya mungkin karena Anda belum menggunakan Tulis dalam produksi (belum). Juga, saya tidak yakin saya setuju bahwa infra abadi adalah ide dasar Docker, meskipun tentu saja ini adalah use case / selling point yang baik.

Adrian Mouat
sumber
Terima kasih atas jawabannya. Saya pikir akan sangat berguna untuk memaksanya di tingkat konfigurasi, mis. untuk menerapkannya pada wadah basis data dan menonaktifkan rekreasi secara default untuk wadah aplikasi ..
Kristof Jozsa
8
--force-recreatetidak berfungsi untuk saya ... Gambar tidak ditarik meskipun versi yang lebih baru ada di sana ...
lisak
1
@lisak Saya tidak pernah mengatakan itu menarik gambar baru. Tidak. Itu baru mulai wadah baru menggunakan gambar apa pun yang tersedia secara lokal. Anda harus menjalankan docker pull secara manual.
Adrian Mouat
2
docker-compose up --build

ATAU

docker-compose build --no-cache
flgn
sumber
1
Jika memungkinkan, harap berupaya memberikan penjelasan tambahan alih-alih hanya kode. Jawaban semacam itu cenderung lebih bermanfaat karena membantu anggota komunitas dan khususnya pengembang baru lebih memahami alasan solusi, dan dapat membantu mencegah perlunya menjawab pertanyaan lanjutan.
Rajan
-10
$docker-compose build

Jika ada sesuatu yang baru itu akan dibangun kembali.

Mathias Asberg
sumber