cờ docker run -it là gì?


108

Tôi đã làm một số thứ phức tạp với docker, nhưng hóa ra tôi không biết -itcờ nghĩa là gì. Gần đây tôi đã xem qua một số ví dụ về docker runlệnh khiến tôi hơi bối rối.

docker run -itd ubuntu:xenial /bin/bash 

Câu hỏi của tôi là viết -itcờ ở đây là như thế nào, nếu vùng chứa trong quá trình khởi tạo chạybin/bash

Trong tài liệu, chúng tôi có một ví dụ

docker run --name test -it debian

với lời giải thích

-It hướng dẫn Docker cấp phát TTY giả được kết nối với stdin của vùng chứa; tạo một bash shell tương tác trong vùng chứa.

và giải thích cho cờ -t từ trang trợ giúp

-t, --tty Phân bổ TTY giả

nếu tôi xóa cờ -it trong

docker run -d ubuntu:xenial /bin/bash

vùng chứa mới tạo của tôi không tồn tại nhiều

trong docker ps -a

nó được chỉ định là đã thoát

Xin lỗi, nếu câu hỏi của tôi khá ngu ngốc, tôi không thể tìm thấy lời giải thích trên Internet (tôi có sự hiểu lầm đáng kể về điểm đó).


Nếu /bin/bashkhông có sẵn nội dung trên stdin, nó không có lệnh nào để chạy và không có cách nào để nhắc người dùng, vì vậy nó sẽ thoát. Đây là hành vi bình thường và được mong đợi 100%.
Charles Duffy

Câu trả lời:


97

-itlà viết tắt của --interactive + --ttykhi bạn docker runsử dụng lệnh này .. nó sẽ đưa bạn vào thẳng bên trong vùng chứa, -dviết tắt của từ --detachđó có nghĩa là bạn chỉ cần chạy vùng chứa và sau đó tách khỏi nó, vì vậy về cơ bản bạn chạy vùng chứa trong nền .. sửa: so nếu bạn chạy vùng chứa docker với -itdnó sẽ chạy các -ittùy chọn và tách bạn khỏi vùng chứa, do đó vùng chứa của bạn vẫn chạy trong nền ngay cả khi không có bất kỳ ứng dụng mặc định nào để chạy ..


Đó không phải là câu trả lời đúng, vì vùng chứa của tôi bị dừng sau khi chạy mà không có tùy chọn -it.
Alex

1
điều đó có nghĩa là có lỗi trong vùng chứa của bạn .. vì vậy vùng chứa của bạn không khởi động được ... hoặc có thể nó không có bất kỳ CMDlệnh nào theo mặc định, vì vậy nó không chạy bất kỳ ứng dụng nào theo mặc định. . Vì vậy, nếu bạn chạy nó trong nền, nó sẽ thoát ngay lập tức vì nó không có bất kỳ công việc nào để làm. .
Fendi jatmiko

@Alex, nếu chương trình trong vùng chứa của bạn là thứ thoát ra khi stdin bị đóng, thì có câu trả lời cho bạn (về lý do tại sao nó sẽ không chạy mà không có -i). Tương tự, nếu nó chạy các lệnh hoạt động khác nhau dựa trên việc có TTY hay không, bạn có thể nhận được hành vi khác biệt tùy thuộc vào sự hiện diện của -t.
Charles Duffy

@Alex, ... và rõ ràng là /bin/bash </dev/nullthoát ngay lập tức, nếu bạn chạy nó mà không có Docker. Chạy docker runmà không -ilàm điều tương tự với bản sao của bashnó bắt đầu. (Nếu không -t, nó có một stdin nhưng không phải là TTY, vì vậy nó không tự phát hiện là một shell tương tác, vì vậy bạn sẽ có một tập hợp các hành vi hơi khác một chút).
Charles Duffy

1
@AdmiralAdama, cách khắc phục vấn đề màu sắc là tùy chọn -t. TTY là cần thiết để hiểu các mã màu.
kroiz

42

docker run -it ubuntu:xenial /bin/bashkhởi động vùng chứa trong chế độ tương tác (do đó có -itcờ) cho phép bạn tương tác với /bin/bashvùng chứa. Điều đó có nghĩa bây giờ bạn sẽ có bashphiên bên trong container, vì vậy bạn có thể ls, mkdirhoặc làm bất cứ lệnh bash bên trong container.

Chìa khóa ở đây là từ "tương tác". Nếu bạn bỏ qua cờ, vùng chứa vẫn thực thi /bin/bashnhưng thoát ngay lập tức. Với cờ, vùng chứa thực thi /bin/bashsau đó kiên nhẫn đợi thông tin đầu vào của bạn.


1
cho những gì tôi cần sử dụng cờ -t sau đó? docker run -i ubuntu:xenial /bin/bash
Alex

3
-t: pseudo tty hoặc "pseudo terminal". Nếu không có thiết bị đầu cuối, bạn không thể gửi đầu vào cho vùng chứa.
dvnguyen 21/118

docker run -it ubuntu:xenial cảm ơn đã trả lời, nhưng tôi cũng sẽ có một phiên đầu cuối với lệnh này từ đầu (vì những gì tôi cần để chạy bin / bash sau đó). Nó cũng tạo ra một phiên đầu cuối
Alex

1
Bạn đúng rồi. Tôi sẽ rút lại lời nói của mình. Không có -tthẻ, người ta vẫn có thể tương tác với vùng chứa, nhưng với nó, bạn sẽ có một thiết bị đầu cuối đẹp hơn, nhiều tính năng hơn. Bạn có thể chạy với -ivà với -itđể thấy sự khác biệt.
dvnguyen 21/118

Tôi không thể tìm thấy bất kỳ sự khác biệt nào. Cảm ơn những nỗ lực của bạn!
Alex
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.