Docker chạy ubfox / bin / bash vs docker chạy ubfox


15

Docker phiên bản 17,06.0-ce

Tôi đang học Docker bằng cách xem một khóa học video.

Giảng viên cho thấy:

sudo docker run -ti ubuntu /bin/bash

Chạy docker với hình ảnh ubfox. Và những gì làm phiền tôi là /bin/bash\. man docker runcho thấy đó /bin/bashlà một lệnh. Đó là docker run IMAGE [COMMAND]. Vâng, nó là ok. Nhưng sự khác biệt giữa

sudo docker run -ti ubuntu 

sudo docker run -ti ubuntu /bin/bash

Đối với tôi không có. Và giảng viên không tập trung chú ý vào mệnh lệnh. Ông nói rằng chúng tôi chỉ chạy docker. Đó là mệnh lệnh đầu tiên của anh ấy trong khóa học. Và sau đó anh ta cho thấy rằng chúng tôi đã bị cô lập khỏi máy chủ, chúng tôi có thể tự do phá hỏng những gì chúng tôi muốn mà không có bất kỳ thiệt hại nào (như rm -rf / bin).

Tôi đã kiểm tra:

$ sudo docker run -ti ubuntu
root@aaf7cd26fe18:/# echo $SHELL
/bin/bash


$ sudo docker run -ti ubuntu /bin/bash
root@6b2570958216:/# echo $SHELL
/bin/bash

Chà, vì bản thân tôi đã quyết định vứt /bin/bashphần này thành rác.

Nhưng dù sao tôi cũng quyết định hỏi bạn: có thể có một số khác biệt giữa hai cách chạy Docker? Nếu có, nó là như thế nào?

Câu trả lời:


11

Hình ảnh Docker có thể chỉ định rằng một lệnh nhất định sẽ được chạy theo mặc định, sử dụng lệnh CMDtrong Dockerfile . Và:

Nếu người dùng chỉ định các đối số docker runthì họ sẽ ghi đè mặc định được chỉ định trong CMD.

Khi nó xảy ra, lệnh mặc định được chỉ định cho Ubuntu Dockerfile , trên thực tế, là bash:

CMD ["/bin/bash"]

Vì vậy, đối với trường hợp cụ thể của hình ảnh Ubuntu, docker run ... ubuntu /bin/bashkhông khác docker run ... ubuntu.

Tất nhiên, điều này không cần phải luôn luôn đúng. Dockerfile cho một công cụ cơ sở dữ liệu có thể chạy lệnh cơ sở dữ liệu theo mặc định. Trong trường hợp đó, nếu bạn cần một vỏ tương tác, bạn sẽ cần phải làm docker run ... /bin/bash.

Nói chung, bạn không thể cho rằng docker runsẽ cung cấp cho bạn một vỏ tương tác. An toàn hơn để chỉ định /bin/bashnếu bạn cần một vỏ.


2

Khi bạn không cung cấp lệnh, trong trường hợp của bạn /bin/bash, trong khi sử dụng -ti( itương tác, tthiết bị đầu cuối), bạn sẽ được gắn vào chương trình mặc định đã được xác định sẽ được thực thi khi sử dụng runlệnh trong DockerFile.

Ví dụ: nếu một hình ảnh chạy một máy chủ web ở nền trước, những gì bạn sẽ thấy sau khi sử dụng runmà không có /bin/bashnhật ký của máy chủ web đó (chương trình mặc định đã được chạy).

Trong khi chỉ định lệnh, bạn đang nói rằng tôi không quan tâm đến những gì đang xảy ra hoặc đang chạy trên hình ảnh, hãy cho tôi một thiết bị đầu cuối tương tác bằng cách chạy "lệnh" này.

Trong Ubuntu, lệnh mặc định là bashvà nếu bạn không cung cấp -tithì container sẽ bị dừng ngay sau khi chạy. bởi vì nó chạy bash ở chế độ không tương tác và sau khi hoàn thành, container không còn gì để làm nữa.

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.