2015-05-09 19 views
83

Tùy chọn này thực hiện chính xác những gì? Tôi đã đọc rất nhiều về TTY và tôi vẫn còn bối rối. Tôi đã chơi xung quanh không có số -t và chỉ -i và có vẻ như các chương trình mong đợi nhập của người dùng sẽ phát ra lỗi mà không cần -t. Tại sao điều quan trọng đối với TTY giả phải được kích hoạt?Bối rối về tùy chọn Docker -t để Phân bổ một pseudo-TTY

Trả lời

46

Đối số "-t" KHÔNG được tài liệu rõ ràng hoặc được nhiều người đề cập thường xuyên, theo tìm kiếm của Google.

Nó thậm chí không hiển thị khi bạn hiển thị danh sách (tất cả đối số docker) bằng cách gõ "docker" tại dấu nhắc Bash (với phiên bản 1.8.1 mới nhất).

Trong thực tế, nếu bạn cố gắng để có được sự giúp đỡ cụ thể về lập luận này bằng cách gõ "Docker -t --help" nếu cho trả lời này đáng ngạc nhiên mơ hồ:

"cờ cung cấp nhưng không được định nghĩa: -t"

Vì vậy, bạn không thể đổ lỗi vì bị nhầm lẫn về lập luận này!

Có một đề cập đến trong documention trực tuyến Docker mà nói nó là "Phân bổ một pseudo-tty" và thường được dùng với -i:

https://docs.docker.com/reference/run/

tôi thấy nó được sử dụng trong tài liệu hướng dẫn cho container Docker tuyệt vời jwilder/nginx-proxy theo cách sau:

docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx 

trong trường hợp này, những gì nó làm là gửi kết quả đến tty 'ảo' (Bash command prompt/terminal) trong container Docker này. Sau đó, bạn có thể thấy kết quả này bằng cách chạy lệnh docker "docker logs CONTAINER" trong đó CONTAINER là cặp ký tự đầu tiên của ID của vùng chứa này. Bạn có thể tìm thấy ID CONTAINER này bằng cách nhập "docker ps -a"

Tôi đã nhìn thấy đối số "-t" này được đề cập một thời gian ngắn trong liên kết sau đây, trong đó nó nói, "Cờ -t và -i phân bổ một pseudo -tty và giữ stdin mở ngay cả khi không được đính kèm. Điều này sẽ cho phép bạn sử dụng vùng chứa giống như một VM truyền thống miễn là dấu nhắc bash đang chạy. "

https://coreos.com/os/docs/latest/getting-started-with-docker.html

Tôi hy vọng điều này sẽ hữu ích! Tôi không chắc tại sao điều này không được ghi lại hoặc sử dụng nhiều. Có thể đó là thử nghiệm và sẽ được triển khai dưới dạng tính năng được ghi lại trong các phiên bản sắp tới.

+11

Các tài liệu xuất hiện cho 'chạy --help' Docker, không phải' Docker -t --help': '-t, --tty = false Phân bổ một pseudo-TTY' " – bskaggs

7

Những gì tôi biết về -t như sau:

docker exec -ti CONTAINER bash - cho phép tôi "login" trong thùng sơn. Nó cảm thấy như ssh-ing (nó không phải).

Nhưng vấn đề là khi tôi muốn khôi phục cơ sở dữ liệu.

Thông thường tôi làm docker exec -ti mysql.5.7 mysql - Ở đây tôi thực hiện lệnh mysql trong vùng chứa và nhận thiết bị đầu cuối tương tác.

Tôi đã thêm <dump.sql vào lệnh trước để tôi có thể khôi phục db. Nhưng nó không thành công với cannot enable tty mode on non tty input.

Xóa -t đã giúp.Vẫn không hiểu tại sao:

docker exec -i mysql.5.7 mysql < dump.sql 

Tác phẩm cuối cùng hoạt động. Hy vọng điều này sẽ giúp mọi người.

43

Tùy chọn "-t" đi tới cách Unix/Linux xử lý truy cập đầu cuối. Trong quá khứ, một thiết bị đầu cuối là một kết nối cứng, sau đó là một kết nối dựa trên modem. Chúng có trình điều khiển thiết bị vật lý (chúng là những thiết bị thực sự). Khi các mạng tổng quát được đưa vào sử dụng, một trình điều khiển giả thiết bị đầu cuối đã được phát triển. Điều này là bởi vì nó tạo ra một sự tách biệt giữa sự hiểu biết những khả năng thiết bị đầu cuối có thể được sử dụng mà không cần phải viết nó vào chương trình của bạn trực tiếp (đọc trang người đàn ông trên stty, curses).

Vì vậy, với nền đó, hãy chạy vùng chứa không có tùy chọn và theo mặc định bạn có luồng xuất bản (vì vậy, docker run | <cmd> hoạt động); chạy với "-i", và bạn nhận được thêm dòng stdin (vì vậy <cmd> | docker run -i hoạt động); sử dụng "-t", thường là trong sự kết hợp "-it" và bạn có một trình điều khiển thiết bị đầu cuối được thêm vào, mà nếu bạn đang tương tác với quá trình này có thể là những gì bạn muốn. Về cơ bản nó làm cho container bắt đầu trông giống như một phiên kết nối đầu cuối.

1

-Điều này chỉ thị Docker cấp phát một TTY giả được kết nối với stdin của vùng chứa, tạo vỏ bash tương tác trong vùng chứa.

--interactive, -i false Keep STDIN open even if not attached 

--tty, -t false Allocate a pseudo-TTY 

https://docs.docker.com/engine/reference/commandline/run/

Các vấn đề liên quan