Bagaimana cara membangun kembali buruh pelabuhan di docker-compose.yml?


218

Ada cakupan layanan yang didefinisikan dalam docker-compose.yml. Layanan ini sudah dimulai. Saya hanya perlu membangun kembali salah satu dari ini dan memulainya tanpa layanan lain. Saya menjalankan perintah berikut:

docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it still running !!!
docker-compose build --no-cache nginx 
docker-compose up -d --no-deps # link nginx to other services

Pada akhirnya saya mendapat wadah nginx tua. Omong-omong komposisi buruh pelabuhan tidak membunuh semua kontainer yang berjalan!


4
docker-compose up --build
Jinna Balu

Jawaban:


234

menyusun buruh pelabuhan

$docker-compose up -d --no-deps --build <service_name>

--no-deps - Jangan memulai layanan tertaut.

--build - Membangun gambar sebelum memulai wadah.


19
docker-compose build service1 service2 --no-cache melakukan pekerjaan ini dengan lebih baik ( github.com/docker/compose/issues/1049 ). Saya memiliki masalah dengan kontainer cache yang dibangun sebelum menggunakan docker-compose up -d --no-deps --build <service_name>
evgpisarchik

33
@evgpisarchik Perintahnya sedikit keluar, seharusnyadocker-compose build --no-cache service1 service2
Matthew Wilcoxson

183

Dengan docker-compose 1.19 up

docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Tanpa satu atau lebih service_nameargumen semua kontainer akan dibangun kembali

Dari menu bantuan

Options:
    -d, --detach        Detached mode: Run containers in the background,
                        print new container names. Incompatible with
                        --abort-on-container-exit.
    --no-deps           Don't start linked services.
    --force-recreate    Recreate containers even if their configuration
                        and image haven't changed.
    --build             Build images before starting containers.

4
Saya bingung bagaimana ini menjawab pertanyaan. Bagaimana kita membangun kembali hanya satu wadah?
Duncan Jones

11
Anda dapat membangun kembali hanya satu wadah dengan menambahkan namanya di akhir perintah. docker-compose up -d --force-recreate --build container_name
HarlemSquirrel

Tunggu sebentar, ini membuat ulang wadah , ini tidak setara dengan build --no-cacheopsi, kecuali jika deskripsi perintah benar-benar salah
Slav

67

Ini akan memperbaiki masalah Anda:

docker-compose ps # lists all services (id, name)
docker-compose stop <id/name> #this will stop only the selected container
docker-compose rm <id/name> # this will remove the docker container permanently 
docker-compose up # builds/rebuilds all not already built container 

12
Jika Anda ingin stopdan rmsemua kontainer maka Anda dapat menggunakan perintah docker-compose down. Solusi Anda lebih baik jika Anda hanya ingin menyingkirkan beberapa.
hirowatari

Solusi ini sangat cocok untuk pengaturan di mana Anda tidak ingin menghentikan seluruh aplikasi buruh pelabuhan dan hanya membuat ulang salah satu layanan
bluesummers

Saya harus benar-benar menjalankan docker-compose build <id/name>sebelum upmembangun kembali Dockerfile yang diubah.
Vajk Hermecz

50

Sebagai @HarlemSquirrel memposting, itu adalah yang terbaik dan saya pikir solusi yang tepat.

Tetapi, untuk menjawab masalah khusus OP, itu harus berupa perintah berikut, karena ia tidak ingin membuat kembali SEMUA layanan dalam docker-compose.ymlfile, tetapi hanya yang nginx:

docker-compose up -d --force-recreate --no-deps --build nginx

Deskripsi opsi:

Options:
  -d                  Detached mode: Run containers in the background,
                      print new container names. Incompatible with
                      --abort-on-container-exit.
  --force-recreate    Recreate containers even if their configuration
                      and image haven't changed.
  --build             Build images before starting containers.
  --no-deps           Don't start linked services.

9

Mungkin langkah-langkah ini tidak sepenuhnya benar, tetapi saya suka ini:

stop docker compose: $ docker-compose down

hapus wadah: $ docker system prune -a

mulai menyusun buruh pelabuhan: $ docker-compose up -d


4

Cukup gunakan:

docker-compose build [yml_service_name]

Ganti [yml_service_name]dengan nama layanan Anda dalam docker-compose.ymlfile. Anda dapat menggunakan docker-compose restartuntuk memastikan perubahan dilakukan. Anda dapat menggunakan --no-cacheuntuk mengabaikan cache.


2

Masalahnya adalah:

$ docker-compose stop nginx

tidak bekerja (Anda bilang itu masih berjalan). Jika Anda akan membangunnya kembali, Anda dapat mencoba membunuhnya:

$ docker-compose kill nginx

Jika masih tidak berhasil, cobalah untuk menghentikannya dengan buruh pelabuhan secara langsung:

$ docker stop nginx

atau hapus itu

$ docker rm -f nginx

Jika itu masih tidak berhasil, periksa versi buruh pelabuhan Anda, Anda mungkin ingin memutakhirkan.

Mungkin bug, Anda bisa memeriksa apakah ada yang cocok dengan sistem / versi Anda. Berikut adalah pasangan, misalnya: https://github.com/docker/docker/issues/10589

https://github.com/docker/docker/issues/12738

Sebagai solusinya, Anda bisa mencoba menghentikan prosesnya.

$ ps aux | grep docker 
$ kill 225654 # example process id

1

Bagi saya itu hanya mengambil dependensi baru dari Docker Hub dengan keduanya --no-cachedan --pull(yang tersedia untuk docker-compose build.

# other steps before rebuild
docker-compose build --no-cache --pull nginx # rebuild nginx
# other steps after rebuild, e.g. up (see other answers)

0
docker-compose stop nginx # stop if running
docker-compose rm -f nginx # remove without confirmation
docker-compose build nginx # build
docker-compose up -d nginx # create and start in background

Menghapus wadah dengan rm sangat penting. Tanpa melepas, Docker akan memulai wadah lama.


-9

Hanya:

$ docker-compose restart [yml_service_name]

4
ini tidak akan membuat perubahan baru. dari manual - Jika Anda melakukan perubahan pada konfigurasi docker-compose.yml, perubahan ini tidak akan tercermin setelah menjalankan perintah ini.
denov
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.