Tôi nên sử dụng docker-compose lên hoặc chạy?


129

Có một lý do để sử dụng runđể khởi động một docker-compose.ymltập tin hay bạn chỉ nên sử dụng up?

Tôi hiểu rằng runcó thể khởi động một container cụ thể, nhưng tôi đang đề cập đến trường hợp bạn sử dụng nó mà không chỉ định một container để nó khởi động tất cả các container yml của bạn.

Câu trả lời:


141

Như đã đề cập trong docker-compose run(2015)

Lệnh được truyền bằng cách chạy ghi đè lệnh được xác định trong cấu hình dịch vụ .
Ví dụ: nếu cấu hình dịch vụ web được bắt đầu bash, thì docker-compose run web python app.pyghi đè lên bằng python app.py.

Sự khác biệt thứ hai là docker-compose runlệnh không tạo ra bất kỳ cổng nào được chỉ định trong cấu hình dịch vụ .
Điều này ngăn chặn các va chạm cổng với các cổng đã mở. Nếu bạn muốn các cổng của dịch vụ được tạo và ánh xạ tới máy chủ, hãy chỉ định cờ --service-port:

$ docker-compose run --service-ports web python manage.py shell

Vì vậy, trừ khi bạn có những nhu cầu cụ thể đó (ghi đè một lệnh hoặc chỉ chạy một container trên các cổng khác nhau), docker-compose up(ngay cả đối với một container) là đủ.

Bạn có thể giúp giải thích tại sao hoặc khi nào bạn không muốn các cổng được tạo không? Đó là lý do tại sao hoặc khi chúng có thể xung đột với các cổng đã mở

Đơn giản vì docker-compose runđược tạo để chạy các lệnh một lần cho các dịch vụ của bạn.
Điều đó có nghĩa là, nếu bạn đã làm một docker-compose up, tất cả các container của bạn đã chạy trên các cổng được chỉ định từ đó docker-compose.yml.
Thực hiện docker-compose runở giai đoạn này (để thực hiện lệnh một lần), nếu nó tôn trọng cùng một cổng, sẽ thất bại ngay lập tức. Do đó, mặc định không tạo ra các cổng.


Một trường hợp sử dụng khác (trong phần Tham chiếu biến môi trường ):

Để xem những biến môi trường nào có sẵn cho một dịch vụ, hãy chạy docker-compose run SERVICE env.


Phiên bản mới nhất (2019+) của các lệnh này được bật docker/docker.github.io:


27

Tôi muốn chỉ ra rằng nếu bạn đang sử dụng Python với trình gỡ lỗi pdb:

import pdb; pdb.set_trace()

Nó sẽ không rơi vào trình bao nếu bạn thực thi tập lệnh của mình bằng cách sử dụng:

docker-compose up

Tuy nhiên, nếu bạn sử dụng run, nó sẽ thả xuống trình gỡ lỗi như mong đợi:

docker-compose run

7

Có một câu trả lời từ các tài liệu docker .

Thông thường, bạn muốn docker-compose up. Sử dụng upđể bắt đầu hoặc khởi động lại tất cả các dịch vụ được xác định trong a docker-compose.yml. Trong chế độ gắn liền với chế độ ăn mặc, bạn sẽ thấy tất cả các bản ghi từ tất cả các thùng chứa. Trong chế độ tách rời của chế độ ( -d), Chế độ thoát ra sau khi khởi động các thùng chứa, nhưng các thùng chứa tiếp tục chạy trong nền.

Các docker-compose runlệnh là để chạy “một lần” hoặc “adhoc” nhiệm vụ. Nó yêu cầu tên dịch vụ bạn muốn chạy và chỉ khởi động các container cho các dịch vụ mà dịch vụ đang chạy phụ thuộc vào. Sử dụng run để chạy thử nghiệm hoặc thực hiện một tác vụ quản trị như xóa hoặc thêm dữ liệu vào vùng chứa khối lượng dữ liệu. Các runlệnh hoạt động như docker run -tiở chỗ nó sẽ mở ra một thiết bị đầu cuối tương tác để các thùng chứa và trả về một trạng thái thoát phù hợp với trạng thái thoát của quá trình trong các thùng chứa.


1
Đây phải là câu trả lời được chấp nhận. Về cơ bản, sử dụng docker-compose runđể thực thi các lệnh đối với một dịch vụ đang chạy và docker-compose upđể sinh ra một dịch vụ mới.
goonerify
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.