Làm thế nào để xây dựng lại container docker trong docker-compose.yml?


218

Có phạm vi dịch vụ được xác định trong docker-compose.yml. Những dịch vụ này đã được bắt đầu. Tôi chỉ cần xây dựng lại một trong số này và khởi động nó mà không cần các dịch vụ khác. Tôi chạy các lệnh sau:

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

Cuối cùng, tôi có container nginx cũ. Bằng cách docker-compose không giết tất cả các container đang chạy!


4
docker-compose up --build
Jinna Balu

Câu trả lời:


232

docker-soạn lên

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

--no-deps - Đừng bắt đầu các dịch vụ được liên kết.

--build - Xây dựng hình ảnh trước khi bắt đầu container.


19
docker-compose build service1 service2 --no-cache thực hiện công việc này tốt hơn ( github.com/docker/compose/issues/1049 ). Tôi gặp vấn đề với các bộ đệm được lưu trong bộ nhớ cache đã được xây dựng trước khi sử dụng docker-compose up -d --no-deps --build <service_name>
evgpisarchik

32
@evgpisarchik Các đơn đặt hàng hơi bị loại bỏ, nên làdocker-compose build --no-cache service1 service2
Matthew Wilcoxson

180

Với docker-compose 1,19 up

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

Nếu không có một hoặc nhiều service_nameđối số, tất cả các container sẽ được xây dựng lại

Từ menu trợ giúp

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
Tôi bối rối làm thế nào điều này trả lời câu hỏi. Làm thế nào để chúng tôi xây dựng lại chỉ một container?
Duncan Jones

11
Bạn chỉ có thể xây dựng lại một container bằng cách thêm tên của nó vào cuối lệnh. docker-compose up -d --force-recreate --build container_name
HarlemSquirrel

Đợi một chút, cái này tạo lại container , nó không tương đương với build --no-cachetùy chọn, trừ khi mô tả lệnh hoàn toàn sai
Slav

67

Điều này sẽ khắc phục vấn đề của bạn:

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
nếu bạn muốn stoprmtất cả các container thì bạn có thể sử dụng lệnh docker-compose down. Giải pháp của bạn sẽ tốt hơn nếu bạn chỉ muốn thoát khỏi một số.
hirowatari

Giải pháp này phù hợp với thiết lập mà bạn không muốn dừng toàn bộ ứng dụng docker và chỉ cần tạo lại một trong các dịch vụ
bluesummers

Tôi cần phải thực sự chạy docker-compose build <id/name>trước upđể xây dựng lại Dockerfile đã thay đổi.
Vajk Hermecz

49

Như @HarlemSquirrel đã đăng, đó là cách tốt nhất và tôi nghĩ giải pháp chính xác.

Nhưng, để trả lời vấn đề cụ thể của OP, nó phải giống như lệnh sau, vì anh ta không muốn tạo lại TẤT CẢ các dịch vụ trong docker-compose.ymltệp, mà chỉ là nginxmột:

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

Mô tả tùy chọn:

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

Có thể các bước này không hoàn toàn chính xác, nhưng tôi thích điều này:

dừng docker sáng tác: $ docker-compose down

loại bỏ container: $ docker system prune -a

bắt đầu soạn thảo docker: $ docker-compose up -d


4

Đơn giản chỉ cần sử dụng:

docker-compose build [yml_service_name]

Thay thế [yml_service_name]bằng tên dịch vụ của bạn trong docker-compose.ymltập tin. Bạn có thể sử dụng docker-compose restartđể đảm bảo thay đổi được thực hiện. Bạn có thể sử dụng --no-cacheđể bỏ qua bộ đệm.


2

Vấn đề là:

$ docker-compose stop nginx

không hoạt động (bạn nói nó vẫn đang chạy). Nếu bạn định xây dựng lại bằng mọi cách, bạn có thể thử giết nó:

$ docker-compose kill nginx

Nếu nó vẫn không hoạt động, hãy thử dừng trực tiếp với docker:

$ docker stop nginx

hoặc xóa nó

$ docker rm -f nginx

Nếu vẫn không được, hãy kiểm tra phiên bản docker của bạn, bạn có thể muốn nâng cấp.

Đó có thể là một lỗi, bạn có thể kiểm tra xem có phù hợp với hệ thống / phiên bản của bạn không. Đây là một cặp vợ chồng, ví dụ: https://github.com/docker/docker/issues/10589

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

Như một cách giải quyết, bạn có thể cố gắng giết quá trình.

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

1

Đối với tôi, nó chỉ tìm nạp các phụ thuộc mới từ Docker Hub với cả --no-cache--pull (có sẵn cho 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

Loại bỏ container với rm là cần thiết. Nếu không gỡ bỏ, Docker sẽ bắt đầu container cũ.


-9

Chỉ có:

$ docker-compose restart [yml_service_name]

4
Điều này sẽ không xây dựng những thay đổi mới. từ hướng dẫn - Nếu bạn thực hiện thay đổi cấu hình docker-compose.yml, những thay đổi này sẽ không được phản ánh sau khi chạy lệnh này.
denov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.