Saya memiliki docker-compose.yml
file yang berisi 4 kontainer: redis, postgres, api, pekerja
Selama pengembangan pekerja, saya sering harus memulai kembali untuk menerapkan perubahan. Apakah ada cara yang baik untuk memulai kembali suatu wadah (mis. worker
) Tanpa memulai kembali wadah lainnya?
docker
docker-compose
Bryan Chen
sumber
sumber
Jawaban:
Ini sangat sederhana: Gunakan perintah:
Anda dapat mengatur waktu untuk menunggu sebelum berhenti membunuh wadah (dalam detik)
Perhatikan bahwa ini akan memulai ulang wadah tetapi tanpa membangunnya kembali. Jika Anda ingin menerapkan perubahan Anda dan kemudian mulai kembali, lihat jawaban lain.
sumber
docker-compose restart
perintah TIDAK akan menerapkan perubahan apa pun. "Jika Anda membuat perubahan padadocker-compose.yml
konfigurasi Anda , perubahan ini tidak tercermin setelah menjalankan perintah ini." Karena itu gunakandocker-compose up -d --build
. docs.docker.com/compose/reference/restartdocker ps -a
restart
tidak berlaku perubahan bahkan jika Anda sudah menjalankandocker-compose build <container name>
dan ini adalah jawaban yang tidak berfungsi / salah.Jawaban lain untuk me-restart satu node ada di target
docker-compose restart worker
,. Itu akan memantul wadah itu, tetapi tidak termasuk perubahan, bahkan jika Anda membangun kembali secara terpisah. Anda dapat secara manualstop
,rm
,create
, danstart
, tetapi ada metode lebih mudah.Jika Anda telah memperbarui kode, Anda dapat melakukan pembuatan dan memuat ulang dalam satu langkah dengan:
Yang pertama akan membangun kembali gambar Anda dari kode yang diubah, yang cepat jika tidak ada perubahan sejak cache digunakan kembali. Dan itu hanya menggantikan wadah yang diubah. Jika gambar yang Anda unduh basi, Anda dapat mengawali perintah di atas dengan:
Untuk mengunduh gambar yang diubah terlebih dahulu (wadah tidak akan dimulai ulang hingga Anda menjalankan perintah seperti di
up
atas). Melakukan penghentian awal tidak perlu.Dan untuk hanya melakukan ini untuk satu layanan, ikuti perintah naik atau tarik dengan layanan yang ingin Anda tentukan, misalnya:
Berikut adalah contoh cepat dari opsi pertama, Dockerfile disusun untuk menjaga bagian kode yang sering berubah mendekati akhir. Bahkan persyaratan ditarik secara terpisah
pip install
karena file itu jarang berubah. Dan karena wadah nginx dan redis mutakhir, mereka tidak direstart. Total waktu untuk seluruh proses di bawah 6 detik:sumber
-no-cache
opsi? Katakanlah saya menambahkan sesuatu ke dalam sayapackage.json
dan perlu kembaliRUN npm install
tetapiDockerfile
itu sendiri belum berubahCOPY
perintah, itu akan memecah cache secara otomatis.COPY
perintah di Dockerfile Anda. Thegit pull
akan memperbarui file package.json dan membangun cache yang akan istirahat ketika buruh pelabuhan melihat Anda menyalin dalam file yang berbeda.ADD
bukannyaCOPY
tetapi ternyata yang terakhir adalah praktik terbaik jadi saya akan melakukannya!ADD
akan memiliki hasil yang sama sepertiCOPY
pada cache cache, tetapi (seperti yang disarankan dalam tautan praktik terbaik) sebagian besar tidak memerlukan kemampuan tambahan jadi saya bahkan tidak repot-repot menyebutkannya.Untuk memulai kembali layanan dengan perubahan di sini adalah langkah-langkah yang saya lakukan:
sumber
docker-compose up -d --build
dan itu akan membangun kembali semuanya dan memulai kembali wadah yang diubah. Tidak perlu berhenti dulu, dengan downtime, dan pisahkan perintah buat dan mulai.up
hanya akan menciptakan kembali wadah yang telah diubah dan karena itu perlu restart.Mengikuti perintah
hanya akan BERHENTI dan MULAI wadah. yaitu tanpa memuat perubahan apa pun dari docker-compose.xml
STOP mirip dengan hibernasi di PC. Karenanya berhenti / mulai tidak akan mencari perubahan yang dibuat dalam file konfigurasi. Untuk memuat ulang dari resep wadah (docker-compose.xml) kita perlu menghapus dan membuat wadah (analogi yang mirip dengan me-reboot PC)
Jadi perintahnya adalah sebagai berikut
sumber
rm
opsi baris-f
berguna (tanpa prompt) dan dengan buruh pelabuhan saat inicreate
danstart
digabung sebagaiup
(jadi secara total kami memiliki 3 perintah bukan 4), dan untukup
opsi-d
berguna (eksekusi ada di latar belakang).Mulai ulang Layanan dengan file komposisi buruh pelabuhan
Gunakan Kasus # 1: Jika COMPOSE_FILE_NAME adalah
docker-compose.yml
dan layanan pekerjaUse Case # 2: Jika nama file
sample.yml
dan layanan pekerjaSecara default buruh pelabuhan-menulis mencari
docker-compose.yml
jika kita menjalankandocker-compose
perintah, kalau tidak kita memiliki bendera untuk memberikan nama file tertentu dengan-f [FILE_NAME].yml
sumber
Perintah 'buruh pelabuhan' yang sederhana tidak tahu apa-apa tentang wadah 'pekerja'. Gunakan perintah seperti ini
docker-compose -f docker-compose.yml restart worker
sumber
Mulai ulang wadah
Jika Anda ingin memulai kembali wadah Anda:
docker-compose restart servicename
Pikirkan perintah ini sebagai "cukup restart wadah dengan namanya", yang setara dengan
docker restart
perintah.Catatan peringatan:
Jika Anda mengubah variabel ENV mereka tidak akan diperbarui dalam wadah. Anda harus menghentikannya dan mulai lagi. Atau, menggunakan perintah tunggal
docker-compose up
akan mendeteksi perubahan dan membuat ulang wadah.Seperti yang disebutkan banyak orang lain, jika Anda mengubah
docker-compose.yml
file itu sendiri, restart sederhana tidak akan menerapkan perubahan itu.Jika Anda menyalin kode Anda di dalam wadah pada tahap pembuatan (
Dockerfile
menggunakanADD
atauCOPY
perintah), setiap kali kode berubah Anda harus membangun kembali wadah (docker-compose build
).Korelasi dengan kode Anda
docker-compose restart
seharusnya berfungsi dengan baik, jika kode Anda mendapat jalur yang dipetakan ke dalam wadah dengan volume directivedocker-compose.yml
seperti:Tetapi saya akan merekomendasikan untuk menggunakan pemuatan ulang kode langsung, yang mungkin disediakan oleh kerangka pilihan Anda dalam mode DEBUG (atau Anda dapat mencari paket muat ulang otomatis dalam bahasa pilihan Anda). Menambahkan ini harus menghilangkan keharusan untuk memulai kembali wadah setiap kali setelah kode Anda berubah, alih-alih memuat ulang proses di dalamnya.
sumber
Jawabannya di sini adalah berbicara tentang refleksi dari perubahan pada file docker-compose.yml.
Tetapi bagaimana jika saya ingin memasukkan perubahan yang telah saya lakukan dalam kode saya, dan saya percaya itu hanya mungkin dengan membangun kembali gambar dan yang saya lakukan dengan mengikuti perintah
1. buruh pelabuhan berhenti
2. penghapusan kontainer buruh pelabuhan
3. penghapusan gambar buruh pelabuhan
4. buat wadah lagi
sumber