Có cách nào để tắt một dịch vụ trong docker-compost.yml không


84

Tôi thấy mình đang ở trong tình huống muốn tắt tạm thời một dịch vụ trong một docker-composetệp.

Tất nhiên là tôi có thể bình luận, nhưng có cách nào để chỉ nói " enabled: false" không?


3
Câu trả lời là: "nó phụ thuộc" ... vào những gì bạn đang cố gắng hoàn thành. Nếu bạn chạy docker-compose upnó sẽ khởi động tất cả các dịch vụ theo mặc định. Tuy nhiên, nếu bạn chạy docker-compose up myservicenó sẽ khởi động dịch vụ thần bí và những thứ phụ thuộc vào nó. Bằng cách thiết lập các phần phụ thuộc, bạn có thể thực hiện nó để dịch vụ xấu không bắt đầu bằng lệnh này. Bạn cũng có thể làm docker-compose runđể chỉ nhận được các dịch vụ bạn muốn. Lựa chọn phù hợp cũng có thể là chia nó thành nhiều tệp soạn để cho phép bạn linh hoạt cần thiết.
Paul Becotte

Để xử lý một nhu cầu tương tự mà tôi có, tôi chơi với tùy thuộc_on và đối số dịch vụ trong docker-soạn lên , hoặc tùy chọn --no-depstrong trường hợp bạn không muốn bắt đầu các phụ thuộc. Tôi biết không phải là những gì bạn đang tìm kiếm, nhưng là một cách khác.
Gonzalo

Một tùy chọn khác là tạo bao nhiêu tệp do docker-soạn tùy ý và chọn tệp nào bạn muốn đưa vào cuộc gọi của mình docker-compose -f docker-compose.yml -f another-docker-compose.yml up -d. Bạn có thể kiểm tra kết quả hợp nhất soạn thư docker bằng lệnh cấu hình :docker-compose -f docker-compose.yml -f another-docker-compose.yml config
Gonzalo


@EshaanBansal Tôi không biết một tính năng như vậy.
VonC

Câu trả lời:


40

Bạn có thể chỉ cần xác định lại entrypointhoặccommand để thay thế lệnh đã nói bằng lệnh nào đó không có tác dụng gì ( /bin/true)

Điều đó sẽ làm cho container thoát ra ngay lập tức, không làm gì cả.


shadi thêm các mẹo sau trong các nhận xét:

Nếu bạn không muốn dịch vụ được xây dựng, hãy xác định lại khóa xây dựng để trỏ đến khóa Dockerfilechỉ có:

FROM tianon/true 
ENTRYPOINT ["/true"]

5andr0 chỉ ra trong phần nhận xét , phần cấp cao nhấtx-disabled: (giống như trường mở rộng)

Tiện lợi hơn rất nhiều: chuyển các dịch vụ bị vô hiệu hóa sang phần cấp cao nhất x-disabled:thay vìservices:

Các phần có x-tiền tố sẽ được phân tích cú pháp, nhưng bị bỏ qua nếu không được sử dụng theo cách dự định như một trường mở rộng.


14
Tôi cũng sẽ thêm / thay đổi restart: "no"để tránh khởi động lại vô hạn
DUzun

2
Điều này không hữu ích trong trường hợp lý do bạn muốn tắt dịch vụ này là vì dịch vụ thậm chí không thể khởi động. Trong trường hợp của tôi, tôi postgres không khởi động vì có một phiên bản postgres khác đang chạy và lệnh port gây ra xung đột. Tôi có thể bắt đầu thay đổi định nghĩa, nhưng tại thời điểm đó nhận xét toàn bộ sự việc sẽ dễ dàng hơn.
blueFast

1
Tiện lợi hơn nhiều: chuyển các dịch vụ bị vô hiệu hóa sang phần cấp cao nhất x-disabled:thay vìservices:
5andr0

@ 5andr0 Thật thú vị. Có tài liệu nào cho phần soạn thảo docker đó không?
VonC

docs.docker.com/compose/compose-file/#extension-fields được giới thiệu trong v3.4. Các phần có tiền tố x sẽ được phân tích cú pháp, nhưng bị bỏ qua nếu không được sử dụng theo cách dự định như một trường mở rộng
5andr0

55

Bạn có thể làm điều đó trong một docker-compose.override.yamltệp.

Tệp này được tự động đọc docker-composevà hợp nhất vào tệp chính docker-compose.yaml.

Nếu bạn đã loại trừ nó khỏi Git, mỗi nhà phát triển có thể điều chỉnh cấu hình (với một vài hạn chế) mà không thay đổi cấu hình gốc docker-compose.yaml.

Vì vậy, dịch vụ foocó thể bị vô hiệu hóa đặc biệt bằng cách xác định lại điểm nhập của nó trong docker-compose.override.yaml:

version: "3"

services:
  foo:
    entrypoint: ["echo", "Service foo disabled"]

1
Nếu bạn có "khởi động lại: trừ khi đã dừng", v.v. hãy bình luận điều đó hoặc nó sẽ liên tục khởi động lại
Andreas

Ý tưởng là thay đổi điểm nhập trong tệp ghi đè. Nếu bạn có các chính sách khởi động lại, hãy thay đổi nó thành vòng lặp ngủ vô hạn
Kos Prov

Để làm rõ, bạn có thể thực hiện việc này trong docker-compost.yml như trong câu trả lời của VonC. Điều đó sẽ phù hợp nếu bạn muốn đăng ký và chia sẻ nó với các nhà phát triển khác. Ngoài ra, định dạng tệp soạn v1 chấp nhận tên dịch vụ (foo trong ví dụ trên) làm khóa cấp cao nhất, thay vì khóa con của "dịch vụ".
Denis Howe

1
Giải pháp này hoạt động hiệu quả nếu tìm cách tắt / bật một dịch vụ cho một môi trường cụ thể (ví dụ: phát triển / dàn dựng / sản xuất) trong đó bạn có một tệp ghi đè khác được chỉ định cho mỗi môi trường với tùy chọn -f.
Justin Emery

với export XXX_ENTRYPOINT=/bin/true docker-compo v3, chúng ta có thể sử dụng env để vô hiệu hóa dịch vụ, tức là: sau đó là `entrypoint: [" $ {XXX_ENTRYPOINT: -docker-entrypoint.sh} "]`
qxo

9

Tôi thêm dòng bổ sung sau vào dịch vụ mà tôi muốn tạm thời vô hiệu hóa:

command: echo "{put your service name here} disabled"

Nó bắt đầu bằng cách nào, nhưng không làm gì cả.


5
Việc xác định commandlại không ảnh hưởng đến điểm vào lệnh. Trong ví dụ của bạn, bạn dựa vào đó entrypointbashtôi đoán. Để làm cho điều này có khả năng phục hồi ((không phụ thuộc vào tích hợp sẵn entrypoint), tôi nghĩ bạn cần xác định lại điểm vào chứ không phải lệnh.
blueFast

4

Không có cách nào để vô hiệu hóa một dịch vụ được xác định trong tệp soạn thảo Docker yaml. Đề xuất của VonC là một giải pháp tốt Vui lòng xem bên dưới tài liệu soạn docker để biết các tùy chọn có sẵn https://docs.docker.com/compose/compose-file/


2

Tôi sẽ mở rộng dịch vụ thành 0 bản sao với: deploy: bản sao: 0

Thật không may, như tài liệu nói rằng điều này chỉ hoạt động với đàn docker.


-3

Tôi hiểu rồi:

docker-compose up $(yq -r '.services | keys | join(" ")' docker-compose.yml | sed 's/service-name//')

-6

Nguyên thủy nhưng thêm một #ở đầu mỗi dòng của dịch vụ.


3
Câu hỏi là về các lựa chọn thay thế để bình luận về một dịch vụ.
Michael Härtl,
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.