에러 발생
도커(Docker)에서 Image를 가져와 컨테이너를 실행했습니다. HTTP 기반 이미지를 가져와서 서버에 특정 파일을 올리는 작업을 하던 중 뭔가 작동이 이상한 듯 해서 컨테이너 내부에 접속을 시도합니다.
$ sudo docker exec -it server bash
server 컨테이너에 접속하려고 하니 에러가 발생합니다.
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown
에러 이유
에러가 발생하는 이유는 "bash" 실행파일을 찾지 못했기 때문입니다. 만약 사용하고자 하는 이미지가 Alpine 리눅스를 기반으로 하고 있는 경우 bash를 지원하지 않을 수 있습니다. 즉 이미지가 어떤 Shell을 사용하고 있는지에 따라서 옵션으로 던져줘야 하는 Shell이 다릅니다.
bash dash 차이
Shell은 유닉스 계열의 OS에서 커널(kernel)과 유저 사이에서 인터페이스 역할을 담당합니다. 파일 시스템을 관리하고 명령어를 해석해줍니다. shell에는 여러 종류가 존재합니다. 현재 사용중인 OS(유닉스 계열)에서 지원 가능한 shell은 다음과 같이 확인할 수 있습니다.
$ sudo cat /etc/shells
제가 사용하고 있는 PC의 경우 sh, bash, zsh, rbash를 지원하고 있습니다.
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/bin/zsh
/usr/bin/zsh
sh는 Dash를 의미하고 Unix 계열 OS의 표준 쉘로 사용되고 있습니다. 우분투 리눅스 OS의 경우 6.0 버전 부터 적용되었고, 가볍고 빠르다는 장점을 가지고 있습니다. 하지만 사용자와 상호작용하는 기능은 대부분 빠졌기 때문에 bash로 작성된 스크립트 파일이 작동하지 않을 수 있습니다.
sh는 dash의 약자입니다.
$ file -h /bin/sh
/bin/sh: symbolic link to dash
Bash는 Bourne Again Shell로 sh의 상위 개념입니다. 리눅스 운영체제의 기본 Shell로 적용되어 있고, 많은 기능을 지원하기 때문에 속도가 느리다는 단점을 가지고 있습니다. 즉 sh의 상위 개념이 Bash 입니다. 런칭 초반만 해도 POSIX(Portable Operating System Inerface) 표준을 준수했지만 추가 기능이 붙으면서 표준을 준수하고 있지는 않습니다.
해결 방법
bash를 지원하지 않는 이미지의 경우 sh(dash)를 사용해 컨테이너에 접속할 수 있습니다. 이미지가 어떤 Shell을 기반으로 하고 있냐에 따라서 컨테이너 접속에 사용해야 되는 Shell도 변경해줘야 합니다.
$ sudo docker exec -it server sh
'Programming' 카테고리의 다른 글
IPFS 우분투 20.04 LTS 설치 방법 (0) | 2022.08.08 |
---|---|
[Docker] Docker Compose 사용법 (도커 네트워크 구성) (0) | 2022.07.28 |
[Docker] 도커(Docker) 이미지 만들기 2가지 방법 (0) | 2022.07.27 |
[Docker] 도커(Docker) 사용법 (0) | 2022.07.27 |
[Hardware] L1, L2, L3 캐시 메모리(Cache Memory)란? (0) | 2022.07.27 |
댓글