Docker - Ubuntu - bash: ping: lệnh không tìm thấy


336

Tôi đã có một Docker container chạy Ubuntu mà tôi đã làm như sau:

docker run -it ubuntu /bin/bash

tuy nhiên nó dường như không có ping. Ví dụ

bash: ping: command not found

Tôi có cần phải cài đặt nó không?

Có vẻ như một lệnh khá cơ bản bị thiếu. Tôi đã thử whereis pingmà không báo cáo bất cứ điều gì.


6
Nó hoàn toàn thích hợp cho hình ảnh Docker là tối thiểu. Trong hầu hết các trường hợp, một container sẽ không bao giờ làm gì ngoài việc chạy một ứng dụng - tại sao lại cài đặt bất cứ thứ gì mà ứng dụng đó không cần?
Charles Duffy

3
Nếu bạn chỉ đơn giản muốn chạy chẩn đoán, thì có thể đơn giản hơn khi chạy busybox (hình ảnh bao gồm ping), ví dụ: docker run -it --rm busybox ping my-server.
Francis Norton

Câu trả lời:


686

Hình ảnh Docker khá tối thiểu, nhưng bạn có thể cài đặt pingtrong hình ảnh docker ub Ubuntu chính thức của mình thông qua:

apt-get update
apt-get install iputils-ping

Có thể bạn không cần pinghình ảnh của mình và chỉ muốn sử dụng nó cho mục đích thử nghiệm. Ví dụ trên sẽ giúp bạn ra ngoài.

Nhưng nếu bạn cần ping để tồn tại trên hình ảnh của mình, bạn có thể tạo một Dockerfilehoặc committhùng chứa mà bạn đã chạy các lệnh trên vào một hình ảnh mới.

Cam kết:

docker commit -m "Installed iputils-ping" --author "Your Name <name@domain.com>" ContainerNameOrId yourrepository/imagename:tag

Dockerfile:

FROM ubuntu
RUN apt-get update && apt-get install -y iputils-ping
CMD bash

Xin lưu ý rằng có những cách tốt nhất để tạo hình ảnh docker, Giống như xóa các tập tin bộ đệm apt sau và vv


apt-get thất bại với Temporary failure resolving 'security.ubuntu.com'rõ ràng vì mạng không có mặt.
Pavel Niedoba

32

Đây là trang Docker Hub cho Ubuntu và đây là cách nó được tạo. Nó chỉ có (phần nào) các gói tối thiểu được cài đặt, do đó nếu bạn cần thêm bất cứ thứ gì bạn cần phải tự cài đặt.

apt-get update && apt-get install -y iputils-ping

Tuy nhiên, thông thường bạn sẽ tạo một "Dockerfile" và xây dựng nó:

mkdir ubuntu_with_ping
cat >ubuntu_with_ping/Dockerfile <<'EOF'
FROM ubuntu
RUN apt-get update && apt-get install -y iputils-ping
CMD bash
EOF
docker build -t ubuntu_with_ping ubuntu_with_ping
docker run -it ubuntu_with_ping

Vui lòng sử dụng Google để tìm hướng dẫn và duyệt Dockerfiles hiện có để xem cách họ thường làm mọi thứ :) Ví dụ kích thước hình ảnh nên được giảm thiểu bằng cách chạy apt-get clean && rm -rf /var/lib/apt/lists/*sau apt-get installcác lệnh.


echo -ethực sự bất chấp tiêu chuẩn sh POSIX , không cho phép nó làm bất cứ điều gì ngoài việc in -etrên đầu ra của nó. (Ngay cả với một số phiên bản bash, đó là hành vi mặc định). printfThay vào đó printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash", sử dụng : và xem phần SỬ DỤNG ỨNG DỤNG trong tài liệu tiêu chuẩn được liên kết ở trên.
Charles Duffy

Ngay cả bash cũng không hỗ trợ echo -etheo cách bạn mong đợi (nhưng thay vào đó sẽ có hành vi tuân thủ tiêu chuẩn) khi ở chế độ POSIX được biên dịch --enable-xpg-echo-defaulthoặc với các biến môi trường phù hợp hoặc cấu hình thời gian chạy khác.
Charles Duffy

(POSIX cho phép echo hoạt động theo cách được xác định theo cách triển khai khi được đưa ra -nlàm đối số đầu tiên hoặc khi có bất kỳ chữ viết tắt dấu gạch chéo nào - nhưng ngay cả khi đó, nó được xác định theo thực thi , không được bảo đảm tiêu chuẩn, do đó hành vi phụ thuộc vào từng lớp vỏ đang sử dụng).
Charles Duffy

Cảm ơn các bình luận và cải tiến, ví dụ thân thiện "sao chép và dán" đã được nhiều người nghĩ đến hơn.
NikoNyrh

7

Nói chung, mọi người lấy hình ảnh chính thức của Ubuntu / CentOS nhưng họ không nhận ra rằng những hình ảnh này là tối thiểu và không có bất cứ điều gì trên đầu trang.

Đối với Ubuntu, hình ảnh này được xây dựng từ các tarball rootfs chính thức do Canonical cung cấp. Cho rằng đó là một bản cài đặt tối thiểu của Ubuntu, hình ảnh này chỉ bao gồm các địa điểm C, C.UTF-8 và POSIX theo mặc định.

Người ta có thể cài đặt các công cụ mạng (bao gồm ifconfig, netstat), ip-utils (bao gồm ping) và các lượt thích khác v.v. trên container và có thể tạo hình ảnh từ container hoặc có thể viết Dockerfile sẽ cài đặt các công cụ này trong khi tạo hình ảnh.

Dưới đây là ví dụ Dockerfile, trong khi tạo hình ảnh từ đây, nó sẽ bao gồm các công cụ sau:

FROM vkitpro/ubuntu16.04
RUN     apt-get  update -y \
&& apt-get upgrade -y \
&& apt-get install iputils-ping -y \
&& apt-get install net-tools -y \
CMD bash

hoặc khởi chạy container từ hình ảnh cơ sở và cài đặt các tiện ích này trên container và sau đó cam kết với hình ảnh. docker commit -m "bất kỳ thông điệp mô tả" container_id image_name: lattest

Hình ảnh đó sẽ có tất cả mọi thứ được cài đặt.


6

Ngoài ra, bạn có thể sử dụng hình ảnh Docker đã được cài đặt ping, ví dụ như busybox :

docker run --rm busybox ping SERVER_NAME -c 2

Đó là một giải pháp, nhưng việc tạo ra một hình ảnh chỉ để thực hiện ping dường như quá mức cần thiết đối với tôi. Tôi muốn thay apt-get iputils-pingvào hình ảnh cần nó.
renatoaraujoc

1

Mỗi khi bạn gặp loại lỗi này

bash: <command>: command not found
  • Trên một máy chủ lưu trữ với lệnh đó đã làm việc với giải pháp này :

    dpkg -S $(which <command>)
    
  • Không có máy chủ với gói đó được cài đặt? Hãy thử điều này :

    apt-file search /bin/<command>
    

1

Đôi khi, cài đặt tối thiểu Linux trong Docker không xác định đường dẫn và do đó cần phải gọi ping bằng cách sử dụng ....

cd /usr/sbin
ping <ip>

0

Tôi đã sử dụng tuyên bố dưới đây trên debian 10

apt-get install iputils-ping
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.