Docker-Ubuntu-bash : ping : 명령을 찾을 수 없습니다


337

우분투를 실행하는 Docker 컨테이너가 있는데 다음과 같이했습니다.

docker run -it ubuntu /bin/bash

그러나 그것은없는 것 같습니다 ping. 예 :

bash: ping: command not found

설치해야합니까?

꽤 기본적인 명령이 누락 된 것 같습니다. whereis ping아무것도보고하지 않는 것을 시도했습니다 .


6
Docker 이미지가 최소화되는 것이 전적으로 적합합니다. 대부분의 경우 컨테이너는 아무것도하지 않고 단일 응용 프로그램 만 실행합니다. 응용 프로그램에 필요없는 것을 설치해야하는 이유는 무엇입니까?
Charles Duffy

3
단순히 진단을 실행하려는 경우 busybox (ping이 포함 된 이미지)를 실행하는 것이 더 간단 할 수 있습니다 (예 : docker run -it --rm busybox ping my-server).
Francis Norton

답변:


688

도커 이미지는 매우 ping작지만 다음을 통해 공식 우분투 도커 이미지에 설치할 수 있습니다 .

apt-get update
apt-get install iputils-ping

ping이미지 가 필요하지 않고 테스트 목적으로 이미지를 사용하고 싶을 수도 있습니다. 위의 예가 도움이 될 것입니다.

당신이 당신의 이미지에 존재하는 핑 (ping) 필요하다면, 당신은을 만들 수 있습니다 Dockerfile또는 commit컨테이너가 새 이미지에 위의 명령을 실행했습니다.

범하다:

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

도커 파일 :

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

다음에 apt 캐시 파일을 지우는 것과 같이 docker 이미지를 만드는 모범 사례가 있습니다.


Temporary failure resolving 'security.ubuntu.com'네트워킹이 없기 때문에 apt-get이 실패합니다 .
Pavel Niedoba

32

이것은 우분투의 부두 노동자 허브 페이지이며, 그것을 만드는 방법입니다. 최소한의 패키지 만 설치되어 있으므로 추가 항목이 필요한 경우 직접 설치해야합니다.

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

그러나 일반적으로 "Dockerfile"을 작성하고 빌드합니다.

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

Google을 사용하여 자습서를 찾고 기존 Dockerfile을 탐색하여 일반적으로 어떻게 작동하는지 확인하십시오. 예를 들어 명령 apt-get clean && rm -rf /var/lib/apt/lists/*후 실행하여 이미지 크기를 최소화해야 apt-get install합니다.


echo -e실제로 POSIX sh 표준을 무시하여-e 출력에 인쇄하는 것 외에는 아무것도 할 수 없습니다 . (일부 버전의 bash에서도 기본 동작입니다). printf대신 :을 사용 printf '%s\n' "FROM ubuntu" "RUN apt-get update && apt-get install -y iputils-ping" "CMD bash"하고 위에 링크 된 표준 문서의 애플리케이션 사용 섹션을 참조하십시오.
Charles Duffy

bash조차도 echo -ePOSIX 모드 --enable-xpg-echo-default에서 또는 적절한 환경 변수 또는 기타 런타임 구성으로 컴파일 된 경우 예상 한 방식을 지원하지 않지만 대신 표준 호환 동작을 갖습니다 .
Charles Duffy

(POSIX를 사용하면 -n첫 번째 인수로 제공되거나 백 슬래시 리터럴이있을 때 에코가 구현 정의 방식으로 작동 할 수 있습니다. 그러나 표준 보증이 아닌 구현 정의 방식 이므로 동작은 개별 쉘에 따라 다릅니다. 사용).
Charles Duffy

의견과 개선에 감사의 말을 전하며, "복사하여 붙여 넣기"친화적 인 예는 더 사후적인 생각이었습니다.
NikoNyrh

7

일반적으로 사람들은 Ubuntu / CentOS의 공식 이미지를 가져 오지만 이러한 이미지가 최소이며 그 위에 아무것도 없다는 것을 인식하지 못합니다.

우분투의 경우이 이미지는 Canonical에서 제공하는 공식 rootfs tarballs에서 빌드됩니다. Ubuntu의 최소 설치이므로이 이미지에는 기본적으로 C, C.UTF-8 및 POSIX 로켈 만 포함됩니다.

하나는 net-tools (ifconfig, netstat 포함), ip-utils (ping 포함) 및 기타 좋아하는 curl 등을 컨테이너에 설치하고 컨테이너에서 이미지를 만들거나 이미지를 만드는 동안 이러한 도구를 설치하는 Dockerfile을 작성할 수 있습니다.

아래는 Dockerfile 예제이며 이미지를 생성하는 동안 다음 도구가 포함됩니다.

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

또는 기본 이미지에서 컨테이너를 시작하고 컨테이너에 이러한 유틸리티를 설치 한 다음 이미지를 커밋합니다. docker commit -m "설명 메시지"container_id image_name : lattest

이 이미지에는 모든 것이 설치됩니다.


6

또는 busybox와 같이 이미 ping이 설치된 Docker 이미지를 사용할 수 있습니다 .

docker run --rm busybox ping SERVER_NAME -c 2

솔루션이지만 핑을 실행하기 위해 이미지를 만드는 것은 나에게 과도한 것 같습니다. 차라리 apt-get iputils-ping필요한 이미지를 원합니다 .
renatoaraujoc

1

이런 종류의 오류가 발생할 때마다

bash: <command>: command not found
  • 해당 솔루션으로 이미 작업중인 해당 명령이있는 호스트에서 :

    dpkg -S $(which <command>)
    
  • 해당 패키지가 설치된 호스트가 없습니까? 이것을 시도하십시오 :

    apt-file search /bin/<command>
    

1

때로는 Docker에서 Linux를 최소 설치해도 경로가 정의되지 않으므로 ...을 사용하여 ping을 호출해야합니다.

cd /usr/sbin
ping <ip>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.