Cara memulai kembali wadah tunggal dengan komposisi buruh pelabuhan

333

Saya memiliki docker-compose.ymlfile 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?

Bryan Chen
sumber
2
buruh
galangan

Jawaban:

398

Ini sangat sederhana: Gunakan perintah:

docker-compose restart worker

Anda dapat mengatur waktu untuk menunggu sebelum berhenti membunuh wadah (dalam detik)

docker-compose restart -t 30 worker

Perhatikan bahwa ini akan memulai ulang wadah tetapi tanpa membangunnya kembali. Jika Anda ingin menerapkan perubahan Anda dan kemudian mulai kembali, lihat jawaban lain.

bmkrio
sumber
3
bagi saya itu berhasil, tetapi pertanyaan umum jika diizinkan di sini: apakah 'restart' menangani kontainer yang tertaut dan memperbarui / etc / hosts atau tidak 'restart' mengubah IP sama sekali?
michabbb
Kontainer dihubungkan dengan nama dan biasanya satu-satunya IP yang perlu Anda khawatirkan adalah IP host buruh pelabuhan eksternal (biasanya 192.168.99.100). Di mana ada beberapa masalah adalah jika Anda, misalnya, restart wadah database yang terhubung dengan wadah lain. Wadah yang tergantung harus cukup tangguh untuk disambungkan kembali.
Ryan Kimber
20
OP menyatakan bahwa ia perlu "memulai kembali untuk menerapkan perubahan". Menurut dokumen, docker-compose restartperintah TIDAK akan menerapkan perubahan apa pun. "Jika Anda membuat perubahan pada docker-compose.ymlkonfigurasi Anda , perubahan ini tidak tercermin setelah menjalankan perintah ini." Karena itu gunakan docker-compose up -d --build. docs.docker.com/compose/reference/restart
featherbelly
5
nb, pekerja adalah nama yang diberikan ke layanan dalam file yaml dan bukan apa pun yang Anda lihat saat menjalankandocker ps -a
worc
2
Jawaban lain ini jauh lebih baik stackoverflow.com/a/39501539/292408 , karena restarttidak berlaku perubahan bahkan jika Anda sudah menjalankan docker-compose build <container name>dan ini adalah jawaban yang tidak berfungsi / salah.
Elijah Lynn
170

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 manual stop, rm, create, dan start, tetapi ada metode lebih mudah.

Jika Anda telah memperbarui kode, Anda dapat melakukan pembuatan dan memuat ulang dalam satu langkah dengan:

docker-compose up --detach --build

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:

docker-compose pull

Untuk mengunduh gambar yang diubah terlebih dahulu (wadah tidak akan dimulai ulang hingga Anda menjalankan perintah seperti di upatas). 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:

docker-compose up --detach --build worker

Berikut adalah contoh cepat dari opsi pertama, Dockerfile disusun untuk menjaga bagian kode yang sering berubah mendekati akhir. Bahkan persyaratan ditarik secara terpisah pip installkarena file itu jarang berubah. Dan karena wadah nginx dan redis mutakhir, mereka tidak direstart. Total waktu untuk seluruh proses di bawah 6 detik:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s
BMitch
sumber
Ini menarik, tetapi bisakah itu digunakan bersama dengan -no-cacheopsi? Katakanlah saya menambahkan sesuatu ke dalam saya package.jsondan perlu kembali RUN npm installtetapi Dockerfileitu sendiri belum berubah
Augustin Riedinger
2
@ augustinriedinger Jika file input Anda diubah dan Anda memasukkannya dengan a COPY perintah, itu akan memecah cache secara otomatis.
BMitch
1
@ augustinriedinger terima kasih. Saya mobile sehingga saya tidak dapat melihat pertanyaan terkait. Dari langkah-langkah dalam pertanyaan Anda, Anda seharusnya sudah memilikiCOPY perintah di Dockerfile Anda. The git pullakan memperbarui file package.json dan membangun cache yang akan istirahat ketika buruh pelabuhan melihat Anda menyalin dalam file yang berbeda.
BMitch
1
Terima kasih tidak tahu tentang perilaku ini! Saya menggunakan ADDbukannya COPYtetapi ternyata yang terakhir adalah praktik terbaik jadi saya akan melakukannya!
Augustin Riedinger
1
@ augustinriedinger ADDakan memiliki hasil yang sama seperti COPYpada cache cache, tetapi (seperti yang disarankan dalam tautan praktik terbaik) sebagian besar tidak memerlukan kemampuan tambahan jadi saya bahkan tidak repot-repot menyebutkannya.
BMitch
28

Untuk memulai kembali layanan dengan perubahan di sini adalah langkah-langkah yang saya lakukan:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker
Jeff
sumber
10
Jika Anda perlu perubahan untuk diterapkan dengan bangunan, Anda dapat dengan mudah melakukan docker-compose up -d --builddan itu akan membangun kembali semuanya dan memulai kembali wadah yang diubah. Tidak perlu berhenti dulu, dengan downtime, dan pisahkan perintah buat dan mulai.
BMitch
4
Ya, jika Anda ingin me-restart semua layanan, tetapi OP hanya ingin me-restart satu layanan dan tidak me-restart yang lain
Jeff
3
Lihat jawaban yang saya posting, dalam contoh, uphanya akan menciptakan kembali wadah yang telah diubah dan karena itu perlu restart.
BMitch
18

Mengikuti perintah

docker-compose restart worker

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

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation
Tuan Coder
sumber
+1, terima kasih banyak! Untuk rmopsi baris -fberguna (tanpa prompt) dan dengan buruh pelabuhan saat ini createdan startdigabung sebagai up(jadi secara total kami memiliki 3 perintah bukan 4), dan untuk upopsi -dberguna (eksekusi ada di latar belakang).
astrowalker
10

Mulai ulang Layanan dengan file komposisi buruh pelabuhan

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

Gunakan Kasus # 1: Jika COMPOSE_FILE_NAME adalah docker-compose.ymldan layanan pekerja

docker-compose restart worker

Use Case # 2: Jika nama file sample.ymldan layanan pekerja

docker-compose -f sample.yml restart worker

Secara default buruh pelabuhan-menulis mencari docker-compose.ymljika kita menjalankan docker-composeperintah, kalau tidak kita memiliki bendera untuk memberikan nama file tertentu dengan-f [FILE_NAME].yml

Jinna Balu
sumber
7

Perintah 'buruh pelabuhan' yang sederhana tidak tahu apa-apa tentang wadah 'pekerja'. Gunakan perintah seperti ini

docker-compose -f docker-compose.yml restart worker

Shtlzut
sumber
4
tidak bekerja - perubahan baru pada coker-compose.yml tidak diterapkan saat restart
jlee
3

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:

  1. Jika Anda mengubah variabel ENV mereka tidak akan diperbarui dalam wadah. Anda harus menghentikannya dan mulai lagi. Atau, menggunakan perintah tunggal docker-compose upakan mendeteksi perubahan dan membuat ulang wadah.

  2. Seperti yang disebutkan banyak orang lain, jika Anda mengubah docker-compose.ymlfile itu sendiri, restart sederhana tidak akan menerapkan perubahan itu.

  3. Jika Anda menyalin kode Anda di dalam wadah pada tahap pembuatan ( Dockerfilemenggunakan ADDatau COPYperintah), setiap kali kode berubah Anda harus membangun kembali wadah ( docker-compose build).

Korelasi dengan kode Anda

docker-compose restartseharusnya berfungsi dengan baik, jika kode Anda mendapat jalur yang dipetakan ke dalam wadah dengan volume directive docker-compose.ymlseperti:

services:

  servicename:
    volumes:
      - .:/code

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.

Lev Rubel
sumber
1

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

docker stop container-id

2. penghapusan kontainer buruh pelabuhan

docker rm container-id

3. penghapusan gambar buruh pelabuhan

docker rmi image-id

4. buat wadah lagi

docker-compose up container-name
Anshul Sharma
sumber